ビット単位演算は、ビット単位の論理演算を実行します。
演算子 | 説明 |
---|---|
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 で埋めます。 |
AND、OR、XOR は、オペランドと結果の対応ビットに影響を及ぼします。第 1 オペランドのビット 0 と第 2 オペランドのビット 0 の組み合わせから結果のビット 0 が得られます。また、第 1 オペランドのビット 1 と第 2 オペランド 1 の組み合わせから結果のビット 1 が得られます。以下、同様です。
否定演算子は、オペランドと結果の対応ビットに影響を及ぼします。
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));