비트 시프트 계산기
정수에 왼쪽 시프트, 논리적 오른쪽 시프트, 산술적 오른쪽 시프트를 적용하고 결과를 2진수, 10진수, 16진수로 표시합니다.
숫자를 입력하고 시프트 종류와 양을 선택하면 세 가지 수 체계로 된 결과를 즉시 확인할 수 있습니다.
비트 시프트 계산기
정수에 왼쪽 시프트, 논리적 오른쪽 시프트, 산술적 오른쪽 시프트를 적용하고 결과를 2진수, 10진수, 16진수로 표시합니다.
비트를 n칸 왼쪽으로 이동합니다. 숫자에 2ⁿ을 곱하는 것과 같습니다. 오른쪽으로 비워진 비트는 0으로 채워집니다.
비트 시프트란
비트 시프트는 컴퓨터 프로그래밍과 디지털 하드웨어 설계에서 가장 기본적인 연산 중 하나입니다. 비트 시프트는 2진수의 모든 비트를 지정한 만큼 왼쪽이나 오른쪽으로 이동시키고, 한쪽 끝에서 빠져나간 비트는 버리며 반대쪽의 빈 자리는 시프트 종류에 따라 채웁니다.
왼쪽 시프트 연산자(<<)는 모든 비트를 n칸 왼쪽으로 이동합니다. 왼쪽에서 빠져나간 n비트는 버려지고 오른쪽에는 0이 n개 붙습니다. 왼쪽 시프트 n칸은 오버플로가 없는 한 수학적으로 정수를 2ⁿ배 하는 것과 같습니다. 예를 들어 5(2진수 101)를 2칸 왼쪽 시프트하면 20(2진수 10100)이 됩니다. 5 × 4 = 20이기 때문입니다. 컴파일러는 2의 거듭제곱 곱셈을 왼쪽 시프트로 바꾸는 경우가 많습니다. 보통 CPU 한 클록 사이클만으로 실행되기 때문입니다.
논리적 오른쪽 시프트(>>>)는 모든 비트를 n칸 오른쪽으로 이동합니다. 오른쪽에서 빠져나간 n비트는 버려지고 왼쪽에는 0이 n개 붙습니다. 이는 숫자를 부호 없는 값으로 취급하며 2ⁿ으로 나눈 뒤 내림하는 것과 같습니다. 예를 들어 40(2진수 101000)을 3칸 논리적 오른쪽 시프트하면 5(2진수 000101)가 됩니다. Java 같은 언어에서는 부호 없는 정수에 대해 논리적 오른쪽 시프트가 표준 동작이므로 >>>를 명시적으로 사용합니다.
산술적 오른쪽 시프트(>>)도 비트를 n칸 오른쪽으로 이동하지만, 왼쪽에는 0 대신 부호 비트, 즉 최상위 비트를 복제합니다. 양수(부호 비트 0)에서는 0이 채워져 논리 시프트와 동일하게 동작합니다. 음수(2의 보수에서 부호 비트 1)에서는 1이 채워져 부호가 유지됩니다. 예를 들어 −16(32비트 2의 보수: ...11110000)을 2칸 산술적 오른쪽 시프트하면 −4(2진수 ...11111100)가 됩니다. 이렇게 하면 숫자의 부호가 유지되며, 부호 있는 정수를 2ⁿ으로 나누고 음의 무한대로 내림하는 것과 같습니다.
비트 시프트는 성능이 중요한 코드에서 널리 사용됩니다. 해시 함수, 암호 알고리즘, 이미지 처리, 오디오 인코딩, 네트워크 프로토콜 파싱 모두 효율을 위해 시프트를 활용합니다. 하드웨어에서는 시프트 레지스터가 기본 회로이며, 직렬 통신 프로토콜, CRC 생성기, 그리고 난수 생성과 데이터 스크램블링에 쓰이는 선형 피드백 시프트 레지스터(LFSR)의 기반이 됩니다.
비트 시프트 예시
시프트와 2의 거듭제곱 곱셈 또는 나눗셈의 관계를 보여 주는 일반적인 연산입니다.
| 연산 | 2진수 결과 | 10진수 확인 |
|---|---|---|
| 5 << 2 (2칸 왼쪽 시프트) | 10100 | 5 × 4 = 20 ✓. 2칸 왼쪽 시프트는 2² = 4를 곱하는 것과 같습니다. |
| 40 >>> 3 (3칸 논리적 오른쪽 시프트) | 101 | 40 ÷ 8 = 5 ✓. 3칸 논리적 오른쪽 시프트는 2³ = 8로 나누는 것과 같습니다. |
| −16 >> 2 (2칸 산술적 오른쪽 시프트) | 11111100 (−4) | −16 ÷ 4 = −4 ✓. 산술 시프트는 부호 비트를 유지하므로 결과가 음수로 남습니다. |
| 2진수 1010 << 1 (1칸 왼쪽 시프트) | 10100 | 2진수 1010(10진수 10)은 10100(10진수 20)이 됩니다. 1칸 왼쪽 시프트하면 값이 두 배가 됩니다. |
비트 시프트 계산기 사용 방법
- 입력 형식을 선택합니다. 10진수 정수(음수 가능)를 입력하려면 '10진수'를, 이진 문자열을 입력하려면 '2진수'를 선택하세요.
- 입력 칸에 숫자를 넣습니다. 이진 입력의 경우 0과 1만 사용하세요.
- 시프트 종류를 선택합니다. '왼쪽 시프트 (<<)'는 2의 거듭제곱 곱셈, '논리적 오른쪽 시프트 (>>>)'는 부호 없는 나눗셈, '산술적 오른쪽 시프트 (>>)'는 부호 있는 나눗셈에 사용합니다.
- 시프트 양, 즉 몇 비트 이동할지(0~31)를 입력합니다.
- '시프트 계산'을 클릭합니다. 결과는 2진수, 10진수, 16진수로 표시됩니다.
비트 시프트 계산기 FAQ
논리적 오른쪽 시프트와 산술적 오른쪽 시프트의 차이는 무엇인가요?
논리적 오른쪽 시프트는 비워진 상위 비트를 항상 0으로 채워서 피연산자를 부호 없는 값으로 취급합니다. 산술적 오른쪽 시프트는 비워진 상위 비트를 부호 비트의 복사본으로 채웁니다. 양수는 0, 2의 보수에서 음수는 1입니다. 음이 아닌 수에서는 두 연산의 결과가 같고, 피연산자가 음수일 때만 다릅니다. C/C++에서는 부호 있는 타입에 대한 >> 연산자가 대부분의 아키텍처에서 산술적 오른쪽 시프트를 수행합니다.
왼쪽 시프트가 왜 2의 거듭제곱 곱셈과 같나요?
2진수에서는 각 비트 위치가 2의 거듭제곱을 나타냅니다. 모든 비트를 한 칸 왼쪽으로 이동하면 각 비트의 값이 두 배가 되므로 전체 값도 두 배가 됩니다. n칸 왼쪽 시프트는 2ⁿ을 곱하는 것과 같습니다. 예를 들어 6(110₂)을 3칸 왼쪽 시프트하면 110000₂ = 48이 되고, 6 × 8 = 48입니다. 컴파일러는 곱셈 인자가 2의 거듭제곱 상수일 때 더 비싼 곱셈 명령을 더 저렴한 시프트 명령으로 바꿉니다.
비트가 끝을 넘어가면 어떻게 되나요?
레지스터 폭을 벗어난 비트는 그냥 버려집니다. 왼쪽 시프트에서는 레지스터 폭을 넘겨 넘친 상위 비트가 사라지므로, 결과가 목표 타입에 들어가지 않으면 예상치 못한 값이 나올 수 있습니다. 오른쪽 시프트에서는 0보다 아래로 내려간 하위 비트가 버려지며, 이는 0 쪽으로의 절단(논리 시프트) 또는 음의 무한대로의 내림(산술 시프트)에 해당합니다.
비트 시프트로 나눗셈을 할 수 있나요?
네. n칸 논리적 오른쪽 시프트는 부호 없는 정수를 2ⁿ으로 나누는 것과 같습니다(소수 부분은 버림). n칸 산술적 오른쪽 시프트는 부호 있는 정수를 2ⁿ으로 나누고 음의 무한대로 내립니다. 이는 음수에 대한 C의 정수 나눗셈과는 다릅니다. 예를 들어 −7 >> 1 = −4(산술 시프트)이지만, −7 / 2 = −3(C는 0 쪽으로 절단)입니다. 필요에 따라 내림 또는 절단을 선택하세요.
최대 시프트 양은 얼마인가요?
32비트 정수의 경우 32비트 이상 시프트하면 C/C++에서 정의되지 않은 동작이며, 하드웨어에서는 보통 32로 나눈 나머지처럼 처리됩니다(n칸 시프트는 n mod 32칸 시프트와 같음). 이 계산기는 0에서 31비트까지를 지원하여 32비트 범위를 모두 커버합니다. 더 큰 시프트가 필요하면 다중 워드 연산이나 64비트 정수 형식이 필요합니다.
실제 프로그램에서 비트 시프트는 어떻게 사용되나요?
비트 시프트는 다양한 곳에서 사용됩니다. 정수 안의 비트 필드 패킹/언패킹(네트워크 패킷 헤더, 픽셀 색상 채널), 2의 거듭제곱으로 빠르게 곱셈·나눗셈, 해시 값 계산, AES와 SHA 같은 암호 원시 구현, 더 큰 워드에서 니블과 바이트 추출, 비트 마스크 계산 등이 대표적입니다. 특정 비트를 분리하거나 설정해야 할 때는 시프트와 비트 AND/OR가 가장 적합한 도구입니다.