비트 연산자(JavaScript)
비트 연산자는 비트 단위로 논리 연산을 수행합니다.
| 연산자 | 설명 |
|---|---|
| a & b | 비트 단위의 AND입니다. a 및 b에서 대응하는 비트가 1이면 1을 리턴하고 두 비트 중 하나가 0이면 0을 리턴합니다. |
| a | b | 비트 단위의 OR입니다. a 및 b에서 대응하는 비트 중 하나가 1이거나 둘 다 1이면 1을 리턴합니다. 두 비트 모두 0이면 0을 리턴합니다. |
| a ^ b | 비트 단위 XOR(배타적 OR)입니다. a 및 b에서 대응하는 비트 중 하나가 1이고 다른 비트가 0이면 1을 리턴합니다. 두 비트 모두 0이면 0을 리턴합니다. |
| ~a | 부정입니다. a의 비트를 반전합니다. |
| a << n | 왼쪽으로 자리 이동합니다. a의 비트를 왼쪽 n번째 위치로 자리 이동합니다. 이때 왼쪽에서 줄어드는 비트는 버리고 비어 있는 오른쪽 위치는 0으로 채웁니다. |
| a >> n | 오른쪽으로 자리 이동합니다(부호 유지). a의 비트를 오른쪽 n번째 위치로 자리 이동합니다. 이때 오른쪽에서 줄어드는 비트는 버리고 비어 있는 왼쪽 위치는 0으로 채웁니다. 단, a의 맨 왼쪽 비트는 유지됩니다. |
| a >>> n | 오른쪽으로 자리 이동합니다. a의 비트를 오른쪽 n번째 위치로 자리 이동합니다. 이때 오른쪽에서 줄어드는 비트는 버리고 비어 있는 왼쪽 위치는 0으로 채웁니다. |
사용법
비트 논리 연산자는 피연산자와 결과를 일련의 32비트(정수와 같음)로 처리합니다.AND, OR, XOR은 피연산자 및 결과에서 대응하는 비트에 적용됩니다. 첫 번째 피연산자의 비트 0은 두 번째 피연산자의 비트 0과 결합하여 결과의 비트 0을 생성합니다. 첫 번째 피연산자의 비트 1은 두 번째 피연산자의 비트 1과 결합하여 결과의 비트 1을 생성하는 식입니다.
부정 연산자는 피연산자와 결과에서 대응하는 비트에 적용됩니다.
예제
이 예제는 정수 값 9, 5, -9를 피연산자로 사용하는 비트 연산자의 연습을 보여줍니다. 정수 9는 앞에 28개의 0이 나오는 비트 구성 1001입니다. 정수 5는 앞에 28개의 0이 나오는 비트 구성 0101입니다. 정수 -9는 앞에 28개의 1이 나오는 비트 구성 0111입니다.function p(stuff) {
print("<<<" + stuff + ">>>");
}
var a = 9; // 0x00000009 bin 0...1001
var b = 5; // 0x00000005 bin 0...0101
p("a & b = " + (a & b)); // 1 0x00000001 bin 0...0001
p("a | b = " + (a | b)); // 13 0x0000000D bin 0...1101
p("a ^ b = " + (a ^ b)); // 12 0x0000000C bin 0...1100
p("~a = " + (~a)); // -10 0xFFFFFFF6 bin 1...0110
p("a << 2 = " + (a << 2)); // 36 0x00000024 0...100100
p("a >> 2 = " + (a >> 2)); // 2 0x00000002 0...0010
p("a >>> 2 = " + (a >>> 2)); // 2 0x00000002 0...0010
p("a >> 2 = " + (-a >> 2)); // -3 0xFFFFFFFD 1...1101
// -9 is 1...0111 >> 2 = 1...1101
이 예제는 매개변수로 정수를 사용하는 함수를 보여주며, 2진 형식으로 동등한 해당 문자열을 리턴합니다. 그리고 오른쪽으로 한 번에 1비트씩 자리 이동하며 맨 오른쪽 비트와 1(비트 설정)을 비교하여 리턴 값을 생성합니다.
function p(stuff) {
print("<<<" + stuff + ">>>");
}
function binaryString(n) {
var nn = n;
var ss = "";
for(var i = 0; i < 32; i++) {
ss = (1 & nn) + ss;
nn = nn >> 1;
}
return ss;
}
p(binaryString(1));
p(binaryString(15));
p(binaryString(128));
p(binaryString(255));
p(binaryString(4096));
이 예제는 매개변수로 정수를 사용하는 함수를 보여주며, 16진 형식으로 동등한 해당 문자열을 리턴합니다. 그리고 오른쪽으로 한 번에 4비트씩 자리 이동하며 오른쪽 4개 비트와 동등한 16진수를 계산하여 리턴 값을 생성합니다.
function p(stuff) {
print("<<<" + stuff + ">>>");
}
function hexString(n) {
var nn = n;
var ss = "";
for(var i = 0; i < 8; i++) {
switch(15 & nn) {
case 15 : ss = "F" + ss; break;
case 14 : ss = "E" + ss; break;
case 13 : ss = "D" + ss; break;
case 12 : ss = "C" + ss; break;
case 11 : ss = "B" + ss; break;
case 10 : ss = "A" + ss; break;
default : ss = (15 & nn) + ss;
}
nn = nn >> 4;
}
return ss;
}
p(hexString(1));
p(hexString(13));
p(hexString(12));
p(hexString(-10));
p(hexString(36));
p(hexString(2));
p(hexString(2));
p(hexString(-3));
p(hexString(1));
p(hexString(15));
p(hexString(16));
p(hexString(62));
p(hexString(128));
p(hexString(255));
p(hexString(2020));
p(hexString(4095));
p(hexString(4096));