이번에 코딩테스트 문제를 풀어보면서 비트 연산을 이용한 문제가 있었다. 옛날에 정보처리기사에서도 자주 언급되었던 개념이었던걸로 기억하는데, 코딩테스트에서도 나올 여지가 있어서 간단하게 정리해본다.
&
는 비트의 자리마다 대응하는 비트의 숫자가 둘다 1인 경우에 1을 반환한다.console.log(5 & 7);
/**
110
111
5와 7을 2진법으로 구현시 110과 111이 나오는데 둘다 1인 경우는 110 이므로 결과는 5가 나온다.
*/
|
는 비트의 자리마다 대응하는 비트의 숫자가 1개라도 1인 경우에 1을 반환한다.console.log(10 | 23);
/**
1010
10111
10과 23은 비트의 자리수가 다르기 때문에 10는 왼쪽으로 부터 0으로 채워 01010으로 비교한다.
이때 자리수마다 하나라도 1이 있는경우는 11111이므로 결과는 31이 나온다.
*/
^
는 두 연산자의 비트의 자리마다 대응하는 비트의 숫자가 둘다 같다면 0을 다르다면 1을 반환한다.console.log(10^23);
/*
01010
10111
10과 23은 비트의 자리수가 다르기 때문에 10는 왼쪽으로 부터 0으로 채워 01010으로 비교한다.
이때 자리수마다 둘다 다른경우는 1을 0인 경우는 0을 반환하므로 11101이므로 결과는 29가 나온다.
*/
x<<y
는 x의 2진수 값을 왼쪽으로 y번 이동 시키는 연산자이다.console.log(10<<2);
/*10의 2비트 왼쪽으로 이동
0000 1010
0001 0100 16 + 4 = 20
0010 1000 32+8 = 40
*/
x>>y
는 4번과 반대로 x의 2진수 값을 오른쪽으로 y번 이동시키는 연산자이다.console.log(10>>2);
/**
0000 1010
0000 0101 4+1 = 5
0000 0010 2 = 2
*/
x>>>y
는 지정된 x의 양수 32 비트를 오른쪽으로 y번 이동시키고 이동시킨곳은 0으로 채우는 연산자이다. x가 양수일때는 우측 이동연산자이지만 x가 음수일때는 비트를 반전시켜 오른쪽으로 y번 이동시킨다.console.log(100 >>> 2);
/**
00000000000000000000000001100100 100
00000000000000000000000000110010 50
00000000000000000000000000011001 25
*/
console.log(-100 >>> 2);
/**
- 00000000000000000000000001100100
->11111111111111111111111110011011로 변환(4294967196) 01111111111111111111111111001101 -> 2147483598
00111111111111111111111111100110 -> 1073741799
*/