비트 시프트란?
비트 시프트는 정수의 2진수 자릿값을 원하는 칸수만큼 왼쪽 또는 오른쪽으로 이동시키는 연산입니다. 시프트 연산은 프로그래밍, 저수준 최적화, 그래픽, 해싱, 임베디드 시스템 등에서 자주 쓰이는 기본 연산입니다. 왼쪽 시프트(n << k)는 비트를 최상위(MSB) 방향으로 밀어내고 빈자리를 0으로 채우며, 오른쪽 시프트(n >> k)는 비트를 최하위(LSB) 방향으로 이동시킵니다.
계산기 사용법
정수 n과 시프트할 비트 수 k를 입력한 뒤 이동 방향을 선택하세요. 계산기가 결과를 10진수 값으로 보여줍니다. 이 도구는 대부분의 프로그래밍 언어와 동일하게 64비트 부호 있는 정수(signed integer) 연산을 사용합니다.
공식 이해하기
한 칸 왼쪽으로 시프트할 때마다 값은 2배가 되므로, k칸 왼쪽 시프트는 \(2^{k}\)를 곱하는 것과 같습니다:
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$반대로 한 칸 오른쪽으로 시프트할 때마다 값은 절반이 되며 소수점 이하는 버려지므로, k칸 오른쪽 시프트는 \(2^{k}\)로 정수 나눗셈을 한 것과 같습니다:
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$그래서 하드웨어에서 시프트 연산이 곱셈이나 나눗셈보다 훨씬 빠른 것입니다.
예제로 보기
n = 16을 k = 2만큼 왼쪽으로 시프트해 보겠습니다. 16을 2진수로 쓰면 10000입니다. 왼쪽으로 두 칸 밀면 끝에 0이 두 개 붙어 1000000, 즉 64가 됩니다. 수식으로 보면 $$16 \times 2^{2} = 16 \times 4 = 64$$ 이죠. 반대로 \(64 \gg 2 = \left\lfloor 64 / 4 \right\rfloor = 16\)이 되어 원래 값으로 돌아옵니다.
2의 거듭제곱 참고표
좌측 시프트 \(k\)는 숫자에 \(2^k\)를 곱합니다. 우측 시프트 \(k\)는 \(2^k\)로 나눕니다 (정수의 경우 나머지는 버립니다). 주어진 시프트 양의 곱수 또는 제수를 즉시 읽기 위해 이 표를 사용하세요.
| 시프트 \(k\) | \(2^k\) (십진법) | \(\ll k\) / \(\gg k\)의 의미 |
|---|---|---|
| 0 | 1 | 변화 없음 |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\) (1 바이트) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\) (1 KiB) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\) (2 바이트) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 MiB |
| 32 | 4,294,967,296 | 32비트 경계 |
| 63 | 9,223,372,036,854,775,808 | 64비트 부호 있는 정수의 최상위 비트 |
자주 묻는 질문
왼쪽 시프트를 하면 데이터가 사라질 수 있나요? 네. 정수의 비트 폭을 넘어간 비트는 버려집니다(오버플로). 다만 64비트 범위 안에서는 이 계산기가 값을 그대로 보존합니다.
음수를 오른쪽 시프트하면 어떻게 되나요? 이 계산기는 산술(부호 있는) 오른쪽 시프트를 사용합니다. 따라서 부호 비트가 유지되어 음수는 그대로 음수로 남습니다.
곱셈·나눗셈 대신 시프트를 쓰는 이유는? 비트 시프트는 대부분의 CPU에서 한 사이클 만에 처리되는 연산이라, 2의 거듭제곱으로 곱하거나 나눌 때 매우 빠른 방법이 됩니다.