[ETC] Bitwise operators

비트연산자

비트 연산자는 컴퓨터 내부의 정보를 비트 단위로 비교하거나 조작할 때 사용합니다.

1) AND ( & )

각 비트를 비교하여 양쪽모두 1이면 1, 아니면 0을 반환

x = 158, y = 249 이라면

x, y 를 이진수로 변환하면

x = 1 0 0 1 1 1 1 0

y = 1 1 1 1 1 0 0 1

x & y = 1 0 0 1 1 0 0 0 = 152 가 된다.

2) OR ( | )

각 비트를 비교하여 어느 한쪽이라도 1이면 1, 어느한쪽도 1이 없다면 0을 반환

x = 158, y = 249 이라면

x, y 를 이진수로 변환하면

x = 1 0 0 1 1 1 1 0

y = 1 1 1 1 1 0 0 1

x y = 1 1 1 1 1 1 1 1 = 255 가 된다.

3) XOR ( ^ )

각 비트를 비교하여 비트가 같다면 0, 다르다면 1을 반환

x = 158, y = 249 이라면

x, y 를 이진수로 변환하면

x = 1 0 0 1 1 1 1 0

y = 1 1 1 1 1 0 0 1

x ^ y = 0 1 1 0 0 1 1 1 = 103 가 된다.

4) NOT( ~ )

각 비트를 반전시킨 값을 반환

x = 158 이라면

x 를 이진수로 변환하면

x = 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0

~ x = 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1 (부호가 있는 2의 보수) = -159 가 된다.

시프트 연산자

비트 열을 좌우로 지시한 만큼 이동한다.

1) Right Shift ( >> )

오른쪽으로 특정 비트 수만큼 이동시키고 빈자리는 양수 일때는 0, 음수 일때는 1로 채운다.

x = 158 이라면

x 를 이진수로 변환하면

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0

x >> 2

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 = 39

2) Left Shift ( << )

왼쪽으로 특정 비트 수 만큼 이동시키고 빈자리는 0으로 채운다.

x = 158 이라면

x 를 이진수로 변환하면

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0

x << 2

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 = 632

3) Unsigned Right Shift ( >>> ) (* cf. ‘<<<‘은 없다, 그러고 ‘>>>‘은 Java에만 있다.)

원리는 >> 과 같다. 그러나 무조건 앞쪽의 비트를 0으로 채운다. 이 연산을 하면 무조건 unsigned가 된다.

양수 일때는 차이가 없고, 음수일 때는 차이가 있다.

양수 )

x = 158 이라면

x 를 이진수로 변환하면

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0

x >>> 2

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 = 39

역시 차이가 없다.

음수 )

x = -159 라면

x를 이진수로 변환하면

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 1

x >>> 2

0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 0 = 1073741784

음수일 때만 고려하면 된다.

기본적인 연산인 만큼 각자 테스트를 통해서 정확하게 알고가면 좋을 것 같다.

코드 )

결과 )