int a = 3; // 0000 0011
int b = a << 2; // b=12, 0000 1100
int c = a >> 1; // c=1, 0000 0001
비트 연산자는 말 그대로 비트 단위로 하는 연산이다. 쉬프트 연산자는 비트를 오른쪽(>>) 혹은 왼쪽(<<)으로 이동시키는 연산이다. 빈 자리는 0으로 채운다.
자세히보면 <<는 이동한 수만큼 2의 거듭제곱으로 곱하고 >>는 나눈다는 것을 알 수 있다.
sbyte a = -127; // 1000 0001
sbyte b = (sbyte)(a >> 1); // 1100 0000, -64
sbyte c = (sbyte)(a << 1); // 0000 0010, 2
>>연산은 이동하는 변수(여기선 b)가 음수를 포함한 자료형일 경우, 최상위의 부호 비트는 이동하되, 유지한다.
<< 연산은 그대로 부호 비트의 유지 없이 이동만 한다.
비트 연산 시 unsigned 자료형으로 맞추고 시작하는 것이 좋다
a = 0010 1011
b = 0110 0001
a&b = 0010 0001 // &: 모두 참(1)이면 참
a|b = 0110 1011 // |: 둘 중 하나라도 참이면 참
a^b = 0100 1010 // ^ : 서로 다르면 참
~a = 1101 0100 // ~ : 비트 반전
XOR 연산은 암호학에서 자주 사용된다.
int id = 123;
int key = 401;
int a = id ^ key; // 490
int b = a ^ key; // 123
어떤 숫자에 같은 값을 두 번 xor하면 원래 값이 나타난다는 원리를 이용한다.
xor한 값을 전달하고 받은 쪽에서 key값을 통해 원래 값이 나타나도록 하여 안전하게 데이터 이동이 가능하다.