🔢 비트 연산 계산기
AND·OR·XOR·NOT과 비트 시프트 결과를 2진수·16진수·10진수로 한 번에 확인해요. 8~64비트, 음수(2의 보수), 0x·0b 입력을 지원해요.
사용법
- A와 B에 정수를 넣어요. 10진수는 그대로 쓰고, 16진수는
0xFF, 2진수는0b1100처럼 앞에 접두사를 붙여요. 음수(-1)도 넣을 수 있어요. - 비트 폭을 골라요. 8·16·32·64비트 중에서 코드에서 쓰는 정수 크기(예: C의
uint8_t,int32_t)와 맞추면 돼요. - 시프트 칸수를 넣으면 A를 왼쪽·오른쪽으로 밀어 낸 결과가 나와요.
- 결과는 각 연산마다 2진수(4비트씩 끊어서), 16진수, 부호 없는 값, 부호 있는 값으로 보여요. 결과 줄을 눌러 복사하거나 상단 copy 버튼으로 전체를 복사하세요.
비트 연산이란
컴퓨터는 모든 정수를 0과 1의 나열로 저장해요. 비트 연산은 숫자를 하나의 값이 아니라 비트 하나하나의 묶음으로 보고 같은 자리끼리 계산하는 연산이에요. 덧셈·뺄셈처럼 올림이 없고, 각 자리가 서로 독립이라 아주 빨라요. 그래서 권한 플래그(읽기·쓰기·실행), 네트워크 마스크, 체크섬, 해시, 그래픽 색상 합성, 암호 알고리즘 곳곳에서 써요.
연산 정리
| 연산 | 기호(C·JS) | 뜻 | 예 (8비트) |
|---|---|---|---|
| AND | & | 두 비트가 모두 1일 때만 1 | 12 & 10 = 8 |
| OR | | | 둘 중 하나라도 1이면 1 | 12 | 10 = 14 |
| XOR | ^ | 두 비트가 다르면 1 | 12 ^ 10 = 6 |
| NOT | ~ | 모든 비트를 뒤집기 | ~12 = 243 |
| 왼쪽 시프트 | << | 왼쪽으로 밀고 오른쪽을 0으로 채움 (2배씩) | 1 << 7 = 128 |
| 산술 오른쪽 시프트 | >> | 오른쪽으로 밀고 맨 앞 부호 비트로 채움 | -8 >> 1 = -4 |
| 논리 오른쪽 시프트 | >>> | 오른쪽으로 밀고 0으로 채움 | 0xF8 >>> 1 = 124 |
NAND·NOR·XNOR은 AND·OR·XOR의 결과를 뒤집은 값이에요. 디지털 회로에서는 NAND 하나만으로 모든 논리 회로를 만들 수 있어서 중요해요.
계산 예시
예시 1 — 12와 10. 8비트로 쓰면 12는 0000 1100, 10은 0000 1010이에요. 같은 자리끼리 보면 1이 겹치는 자리는 하나(0000 1000)라서 AND는 8, 하나라도 1인 자리는 0000 1110이라 OR는 14, 서로 다른 자리는 0000 0110이라 XOR는 6이에요. 12를 NOT 하면 1111 0011이고, 부호 없는 값으로 243(= 255 − 12)이에요.
예시 2 — 음수는 2의 보수. -1을 8비트에 담으면 모든 비트가 1인 1111 1111(= 0xFF = 부호 없는 255)이에요. 이 값과 5를 AND 하면 5의 비트가 그대로 남아 5가 돼요. 음수 n의 표현은 2w + n으로 계산하면 돼요(8비트에서 -8은 256 − 8 = 248 = 1111 1000).
예시 3 — 오른쪽 시프트 두 종류. 8비트의 -8(1111 1000)을 1칸 오른쪽으로 밀면 산술 시프트(>>)는 앞을 1로 채워 1111 1100(-4), 논리 시프트(>>>)는 0으로 채워 0111 1100(124)이 돼요. 부호 있는 수를 2로 나눌 때는 산술, 비트 묶음으로 다룰 때는 논리 시프트를 써요.
예시 4 — 왼쪽 시프트와 넘침. 1을 7칸 왼쪽으로 밀면 1000 0000 = 128이에요. 8비트에서는 한 칸 더 밀면 비트가 밖으로 나가 0이 돼요. 계산기는 선택한 비트 폭에서 자른 결과를 보여 줘요.
실무에서 자주 쓰는 비트 패턴
- 비트 켜기:
flags | (1 << n)— n번째 비트를 1로 만들어요. - 비트 끄기:
flags & ~(1 << n)— n번째 비트를 0으로 만들어요. - 비트 뒤집기:
flags ^ (1 << n)— n번째 비트를 토글해요. - 비트 확인:
(flags >> n) & 1— n번째 비트가 1인지 0인지 구해요. - 짝수·홀수:
x & 1— 마지막 비트가 1이면 홀수예요. - 2의 거듭제곱 검사:
x > 0 && (x & (x - 1)) == 0— 1인 비트가 하나뿐이면 참이에요. - 값 교환:
a ^= b; b ^= a; a ^= b;— 임시 변수 없이 두 값을 바꿔요(가독성 때문에 실무에서는 잘 안 써요). - 서브넷 마스크: IP와 마스크를 AND 하면 네트워크 주소가 나와요. 자세한 계산은 IP 서브넷 계산기를 쓰세요.
2진수와 16진수 읽는 법
2진수 4자리는 16진수 1자리와 정확히 대응돼요. 그래서 긴 2진수를 4비트씩 끊어 읽으면 16진수로 바로 바꿀 수 있어요. 예를 들어 1111 0011은 1111 = F, 0011 = 3이라 0xF3이에요. 반대로 0x2A는 2 = 0010, A(10) = 1010이라 0010 1010 = 42예요. 이 계산기가 2진수를 4비트씩 띄어 보여 주는 이유도 같아요. 표로 외워 둘 값은 0=0000, 1=0001, 2=0010, 3=0011, 4=0100, 5=0101, 6=0110, 7=0111, 8=1000, 9=1001, A=1010, B=1011, C=1100, D=1101, E=1110, F=1111이에요. 8비트(1바이트)는 16진수 2자리, 32비트는 8자리, 64비트는 16자리로 적어요.
활용 예시 — 파일 권한과 색상 코드
파일 권한(chmod). 읽기(r)=4, 쓰기(w)=2, 실행(x)=1이라서 비트로 보면 r=100, w=010, x=001이에요. 755는 소유자 111(rwx), 그룹 101(r-x), 기타 101(r-x)이고, 권한 확인은 mode & 4처럼 AND로 해요. 숫자 권한을 바로 풀어 보려면 chmod 권한 계산기를 쓰세요.
색상 코드에서 R·G·B 뽑기. 0xFF8040에서 빨강은 (c >> 16) & 0xFF = 255, 초록은 (c >> 8) & 0xFF = 128, 파랑은 c & 0xFF = 64예요. 시프트로 원하는 바이트를 맨 아래로 내린 뒤 0xFF와 AND 해서 나머지를 지우는 방식이에요. 이 계산기에서 A에 0xFF8040, 비트 폭 32, 시프트 16을 넣으면 논리 시프트 결과 줄에서 빨강 값 255(0xFF)를 바로 볼 수 있어요.
비트 개수 세기와 패리티
결과 요약에 나오는 'A의 1 비트 N개'는 포퓰레이션 카운트(popcount)예요. 1 비트가 짝수 개인지 홀수 개인지를 패리티라고 하고, 통신에서 오류를 간단히 확인하는 데 써요. 예를 들어 0000 1100은 1이 2개라 짝수 패리티예요. 1이 몇 개 켜져 있는지는 권한 플래그가 몇 개 설정됐는지, 집합에 원소가 몇 개 들어 있는지를 비트마스크로 표현한 문제에서도 그대로 답이 돼요. 코딩 테스트의 비트마스크 문제를 풀다가 값이 맞는지 의심될 때, 직접 손으로 쓰기 전에 이 계산기로 중간 값을 확인해 보세요.
자주 하는 실수
- 비트 폭을 생각하지 않음: ~12는 8비트에서 243이지만 32비트에서는 4294967283이에요. 같은 NOT도 폭에 따라 결과가 달라요. 코드의 자료형에 맞춰 폭을 고르세요.
- JavaScript는 32비트 부호 있는 정수: JS의
~,&,<<는 숫자를 32비트 정수로 바꿔 계산해서~12가 -13으로 나와요. 이 계산기의 32비트 '부호 있는 값'과 같아요. 64비트를 다루려면 BigInt를 써야 해요. - 논리 연산과 혼동:
&&,||는 참/거짓을 다루는 논리 연산이고,&,|는 비트 연산이에요.if (a & b)처럼 쓰면 의도와 다르게 동작할 수 있어요. - 연산자 우선순위: C와 JS에서
==가&보다 우선순위가 높아x & 1 == 0은x & (1 == 0)으로 해석돼요. 괄호를 꼭 쓰세요. - 시프트 칸수가 폭 이상: 32비트 값을 32칸 이상 시프트하면 언어마다 결과가 달라요(C는 정의되지 않은 동작, JS는 칸수를 32로 나눈 나머지만 써요).
모든 계산은 이 브라우저 안에서만 이뤄지고 입력값은 전송되지 않아요. 64비트까지 BigInt로 정확하게 계산해요.