2진수 형태로 저장되어 있는 값들을 왼쪽(<<)이나 오른쪽(>>)으로 지정한 비트 수만큼 밀어주면 2배씩 늘어나거나 반으로 줄어드는데, 이를 비트 시프트 연산이라고 합니다.
왼쪽 비트시프트(<<)가 될 때에는 오른쪽에 0이 주어진 개수만큼 추가되고,
오른쪽 비트시프트(>>)가 될 때에는 왼쪽에 0(0 또는 양의 정수인 경우)이나 1(음의 정수인 경우)이 개수만큼 추가됩니다.
범위(32비트)를 넘어서 이동되는 비트는 삭제됩니다.
int a=10;
printf("%d", a << 1); // 10을 2배 한 값인 20 이 출력된다.
printf("%d", a >> 1); // 10을 반으로 나눈 값인 5 가 출력된다.
printf("%d", a << 2); // 10을 4배 한 값인 40 이 출력된다.
printf("%d", a >> 2); // 10을 반으로 나눈 후 다시 반으로 나눈 값인 2 가 출력된다.
#include <stdio.h>
int main(void)
{
int a=10;
printf("%d\n", a << 4);
}
// 결과값 :: 160
어떤 원리로 16배가 되는 것인가요 ? - 2진수 계산법
00001010 << 2 = 10100000
(2진수 10) (2진수 160)
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
∴ 1이 할당된 비트 자릿수의 2^n 값을 모두 더해주면 160이 됩니다.
printf 함수의 형식 문자열에는 8진수(%o), 10진수(%d), 16진수(%x)를 나타내는 서식 지정자가 존재하지만, 2진수의 서식 지정자는 존재하지 않습니다.
때문에 2진수를 나타내기 위해서는 10진수를 2진수로 변환하여야 하는데, 이 경우에 비트 시프트 연산 방식이 사용됩니다.
// 서식 지정자(format specifier) ?
printf 함수의 형식 문자열에서 %와 함께 사용되어 출력할 값의 형식을 알려주는 문자