0

シンプルです。JavaScript では常に結果として生成される0xf12345678>>>4はずですか? 0x1234567これがすべてのブラウザで機能すると仮定できますか?

4

2 に答える 2

1

はい、ECMAScript 5 仕様に従って、>>>オペレーターは内部ToUInt32アルゴリズムを実行します。

仕様のセクション 11.7.3 を参照してください。

  1. ShiftExpression を評価した結果を lref とします。
  2. lval を GetValue(lref) とします。
  3. AdditiveExpression を評価した結果を rref とする。
  4. rval を GetValue(rref) とします。
  5. lnum を ToUint32(lval) とします。
  6. rnum を ToUint32(rval) とします。
  7. shiftCount を、rnum の最下位 5 ビットを除くすべてをマスクした結果、つまり、rnum & 0x1F を計算した結果とします。
  8. shiftCount ビットで lnum のゼロ埋め右シフトを実行した結果を返します。空いたビットはゼロで埋められます。結果は符号なし 32 ビット整数です。

結果は常に 32 ビット整数であることが非常に明確に示されています。

この>>>演算子は、通常、32 ビットの符号なし整数に変換するために使用されます。たとえば、MDN はシムでそれを使用しています。例: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/forEach#Compatibility

于 2012-11-12T05:46:56.910 に答える
0

信頼できる仮定であるべきです。任意の JS インタープリターは0xf12345678、操作を計算する前に、単一のオペランドとして読み取ります。あなたが安全になりたいなら、なぜ(0xf12345678)>>>4ですか?

ここの問題の詳細: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Bitwise_Operators

ビット演算子は、オペランドを 10 進数、16 進数、または 8 進数としてではなく、32 ビット (0 と 1) のシーケンスとして扱います。たとえば、10 進数の 9 のバイナリ表現は 1001 です。ビット単位の演算子は、そのようなバイナリ表現で演算を実行しますが、標準の JavaScript 数値を返します。

于 2012-11-12T05:46:47.533 に答える