비트 연산 시뮬레이터(AND・OR・XOR・NOT・시프트)

두 개의 숫자에 대해 AND・OR・XOR・NOT・왼쪽 시프트・오른쪽 시프트를 계산하고, 어떤 비트가 바뀌었는지 2진수 그리드로 시각화합니다. 8/16/32비트를 지원합니다.

사용 팁

  • 값은 10진수뿐 아니라 `0x1A`와 같은 16진수, `0b1010`과 같은 2진수 접두사로도 입력할 수 있습니다. 코드에 쓰는 표기 그대로 붙여넣어 테스트할 수 있습니다.
  • AND・OR・XOR은 두 개의 값을, NOT은 하나의 값만 사용하는 연산입니다. 연산을 전환하면 입력란 수가 자동으로 바뀝니다.
  • 오른쪽 시프트(`>>>`)는 논리 시프트만 지원합니다. 부호 비트를 유지하는 산술 시프트와의 차이는 FAQ를 참고하세요.
  • 비트 폭을 8→16→32로 바꾸면 같은 숫자라도 상위 비트의 0 개수가 늘어나는 것을 확인할 수 있어, "비트 폭"의 의미를 이해하는 데 도움이 됩니다.
  • 노란색으로 강조된 비트는 연산 전후로 바뀐 자리입니다. AND・OR에서 어느 입력값이 각 자리에서 "이겼는지"를 시각적으로 따라갈 수 있습니다.

자주 묻는 질문

있습니다. 논리 시프트(`>>>`)는 비게 되는 상위 비트를 항상 0으로 채우는 반면, 산술 시프트(`>>`)는 부호 비트(최상위 비트)를 그대로 복사해 채웁니다. 이 도구는 값을 선택한 비트 폭 내의 음이 아닌 정수로 다루기 때문에 부호 자체가 주된 목적이 아니어서, 이해하기 쉬운 논리 시프트만 제공합니다.

JavaScript의 비트 연산자는 내부적으로 32비트 부호 있는 정수로 계산하기 때문에, 예를 들어 8비트 `00000001`(1)에 NOT을 적용하면 보통 `-2`라는 음수가 됩니다. 이 도구는 선택한 비트 폭(8/16/32)으로 결과를 다시 마스킹하므로, 8비트라면 `11111110`(254)처럼 해당 비트 폭 안에서의 올바른 표현을 보여줍니다.

AND는 두 비트가 모두 1일 때만 1이 되는 연산으로, 특정 비트만 추출하는 마스킹 처리에 자주 쓰입니다. OR는 둘 중 하나라도 1이면 1이 되는 연산으로, 특정 비트를 켜는 데 쓰입니다. XOR은 두 비트가 서로 다를 때만 1이 되는 연산으로, 비트를 반전시키거나 두 값을 교환하는 데 사용됩니다.

왼쪽 시프트(`<<`)는 2의 거듭제곱(2배・4배 등)을 빠르게 곱하는 방법으로, 오른쪽 시프트(이 도구에서는 논리 시프트)는 2로 나누거나 값에서 특정 범위의 비트를 추출하는 데 자주 사용됩니다. 두 연산 모두 알고리즘 대회나 비트마스크 기반 알고리즘에서 자주 등장합니다.

엄밀히는 다른 개념입니다. 비트 연산은 AND・OR・XOR・NOT・시프트라는 연산 자체를 가리키고, 비트마스크는 그 연산(특히 AND나 OR)과 함께 사용해 "특정 비트만 추출하거나 변경"하기 위한 값을 가리킵니다. 예를 들어 `value & 0b00001111`은 하위 4비트만 추출하는 대표적인 비트마스크입니다.
ツールくん

여담 ― XOR의 신기한 성질과 실제 활용

비트 연산은 컴퓨터의 논리 회로에 그대로 대응하는 가장 기본적인 연산으로, CPU가 단 한 클록만에 실행할 수 있을 만큼 빠릅니다. 사칙연산보다 훨씬 단순한 구조로 구현할 수 있기 때문에, 성능이 중요한 분야(이미지 처리・암호화・네트워크 프로토콜 구현 등)에서는 곱셈이나 나눗셈 대신 비트 연산으로 동등한 처리를 하는 기법이 오래전부터 쓰여 왔습니다.

XOR(배타적 논리합)에는 흥미로운 성질이 있습니다. 같은 값끼리 XOR하면 항상 0이 되고(`a ^ a = 0`), 0과 XOR하면 원래 값이 그대로 나옵니다(`a ^ 0 = a`). 이 두 성질을 이용하면 임시 변수 없이 두 변수의 값을 교환하는 "XOR 스왑"이라는 고전적인 기법이 성립합니다(`a ^= b; b ^= a; a ^= b;`). 오늘날에는 가독성 때문에 실무에서는 잘 권장되지 않지만, 비트 연산의 성질을 배우는 소재로 지금도 자주 인용됩니다.

비트마스크는 실무에서도 폭넓게 사용됩니다. 유닉스의 파일 권한(읽기 4・쓰기 2・실행 1의 조합)은 그 자체로 비트 OR와 AND이며, RGB 색상 코드 `#FF0000`에서 빨강・초록・파랑 성분을 추출하는 처리도 오른쪽 시프트와 AND 마스크의 조합으로 구현할 수 있습니다. 여러 개의 켬/끔 플래그를 하나의 정수로 묶어 관리하는 "비트 플래그" 기법도, 메모리가 제한적이던 옛날 게임이나 시스템 프로그래밍에서 널리 사용되어 왔습니다.