비트 연산자(JavaScript)

비트 연산자는 비트 단위로 논리 연산을 수행합니다.

연산자 설명
a & b 비트 단위의 AND입니다. ab에서 대응하는 비트가 1이면 1을 리턴하고 두 비트 중 하나가 0이면 0을 리턴합니다.
a | b 비트 단위의 OR입니다. ab에서 대응하는 비트 중 하나가 1이거나 둘 다 1이면 1을 리턴합니다. 두 비트 모두 0이면 0을 리턴합니다.
a ^ b 비트 단위 XOR(배타적 OR)입니다. ab에서 대응하는 비트 중 하나가 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));