そのため、コンソールでシフトをいじっていましたが、その結果には困惑しました。
入力:
a = -1
a >>> 100
出力:
268435455
Mozillaのリファレンス ページを参照しましたが、大量にシフトした場合の >>> の動作については何も言及されていません。ゼロフィルですべてのビットを右にシフトするとゼロになると想定しました。
これはFirefoxのバグか何かですか?
そのため、コンソールでシフトをいじっていましたが、その結果には困惑しました。
入力:
a = -1
a >>> 100
出力:
268435455
Mozillaのリファレンス ページを参照しましたが、大量にシフトした場合の >>> の動作については何も言及されていません。ゼロフィルですべてのビットを右にシフトするとゼロになると想定しました。
これはFirefoxのバグか何かですか?
最大31までしかシフトできないようです。
投稿でリンクしたサイトから ( MDN ):
バイナリ表現の a を b (< 32) ビット右にシフトし、シフトオフされたビットを破棄し、左からゼロをシフトインします。
実機スペックより(77ページ)
shiftCount を、rnum の最下位 5 ビットを除くすべてをマスクした結果、つまり、rnum & 0x1F を計算した結果とします。
実際に起こっていることは、100 シフトする(100 & 0x1F)
と 4 シフトすることです。
-1 >>> 100 === -1 >>> 4
複数のシフトに分割する場合は、次のように機能します。
-1 >>> 25 >>> 25 >>> 25 >>> 25 === 0
JavaScriptの a のビット演算子Number
は、そのオペランドを 32 ビットのビッグ エンディアンの符号付き数値に変換します。
これは、数値が 32 ビットで格納できるものよりも大きい場合、切り捨てられることを意味します。ビッグエンディアンとは、数値を左から右に読み取るときに自然な順序で格納されることを意味します。つまり、より重要な数値が最初に格納されるため、数値が 1 バイトを超えて格納される場合、最初のバイトがより重要になります。
これは、-1
のバイナリ表現が次のようになることを意味します...
11111111 11111111 11111111 11111111
(これは-1
2の補数です。これは、数値の値を 2 進数で計算し、各ビットを反転して 1 を加算することによって実行されます。)
でシフトすると、だけシフトする100
ことがわかります...4
00001111 11111111 11111111 11111111
ご覧のとおり、上位ビットは設定されていないため、負ではなく、実際には負になってい268435455
ます(質問の数値)。