JavaScript/符号なし右シフト演算子
表示
>>> は、符号なし右シフト演算子です。この演算子は、左辺の値のビット表現を右辺の値の分だけ右にシフトし、空いた左側のビットを常に0で埋めます[1]。
構文
[編集]a >>> b
a: シフト対象の値(32ビット整数に変換されます)。b: シフトするビット数(32ビット整数に変換され、下位5ビットのみ使用されます)。
例
[編集]正の数の符号なし右シフト
[編集]以下のプログラムは、正の数に対して符号なし右シフトを適用した結果を示します。
const a = 9; // 二進数: 00000000000000000000000000001001 console.log(a >>> 2); // 2 (二進数: 00000000000000000000000000000010) console.log(a >>> 0); // 9 (変更なし)
このプログラムでは、9 を 2 ビット右にシフトすると 2 が得られます。0 ビットシフトすると値は変わりません。
負の数の符号なし右シフト
[編集]以下のプログラムは、負の数に対して符号なし右シフトを適用した結果を示します。
const a = -9; // 二進数: 11111111111111111111111111110111 console.log(a >>> 2); // 1073741821 (二進数: 00111111111111111111111111111101) console.log(a >>> 0); // 4294967287 (二進数: 11111111111111111111111111110111)
このプログラムでは、負の数 -9 を符号なし右シフトすると、最上位ビットに0が埋められるため、結果は非常に大きな正の数になります。
32ビットを超える値のシフト
[編集]以下のプログラムは、シフト量が32ビットを超える場合の挙動を示します。
const a = 9; console.log(a >>> 2); // 2 console.log(a >>> 34); // 2 (34 % 32 = 2 と同じ) console.log(a >>> 32); // 9 (32 % 32 = 0 と同じ)
このプログラムでは、シフト量が32以上の場合、実際には32で割った余りと同じビット数だけシフトされることを示しています。
注意点
[編集]- 32ビット変換: 両オペランドは32ビット整数に変換されます。
- 符号なし: 右シフト演算子
>>とは異なり、符号なし右シフト演算子>>>は常に0を左側に埋めます。 - モジュロ32: シフト量(右オペランド)は32で割った余り(モジュロ32)として扱われます。
- 数値変換: 非数値オペランドは、数値に変換されてから演算が行われます。
脚註
[編集]- ^ これは、符号を考慮せずに右シフトを行うために使用されます。