23

JavaScriptでビット演算子をいじっていますが、注目すべきことが1つあります。

2つの入力ビットの1つがである場合、ビット単位または演算子は出力ビットとして返さます。したがって、効果がないため、これを行うと常にが返されます。11x | 0x| 0

  • ( 1 | 0 ) === 1
  • ( 0 | 0 ) === 0

しかし、計算するInfinity | 0と、が得られ0ました。これは私の意見では驚くべきことです。なぜなら、上記の方法で取得する必要があるからInfinityです。結局のところ、( x | 0 ) === x

ECMAscript仕様のどこでこれが明示的に定義されているのかわからないので、正確には何を意味するのか疑問に思いました( Infinity | 0 ) === 0。おそらくその方法Infinityはメモリに保存されていますか?もしそうなら、それでも| 0操作を行うとそれが戻るのに0| 0もすべきではないということはどうしてですか?

4

2 に答える 2

52

ビット演算子は整数でのみ機能します。
Infinityは浮動小数点値であり、整数ではありません。

仕様によると、ビット単位の演算のすべてのオペランドは、演算を実行する前に(ToInt32演算を使用して)整数に変換されます。

ToInt32操作は次のように述べています。

数値がNaNの場合、+ 0、-0、+∞、または–∞は+0を返します。

于 2011-07-11T12:30:30.497 に答える
2

で整数を期待する数学やその他の操作を行うことNaNInfinity、通常は悪い考えです。Infinityから少し設定/クリアしますか?

実際、ビット単位の演算は整数に対してのみ定義されており、整数にはまたはがありませNaNInfinity

于 2011-07-11T12:30:56.663 に答える