ビット単位演算 (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 は、オペランドと結果の対応ビットに影響を及ぼします。第 1 オペランドのビット 0 と第 2 オペランドのビット 0 の組み合わせから結果のビット 0 が得られます。また、第 1 オペランドのビット 1 と第 2 オペランド 1 の組み合わせから結果のビット 1 が得られます。以下、同様です。

否定演算子は、オペランドと結果の対応ビットに影響を及ぼします。

この例では、整数値 9、5、-9 をオペランドとするビット単位演算を実行します。整数 9 のビット構成は、28 個のゼロの後に 1001 となります。 整数 5 のビット構成は、28 個のゼロの後に 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

この例は、パラメータとして整数を取り、それに対応するバイナリフォーマットのストリングを返す関数を示しています。 ビットを一度に 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));