javascript integer division、またはmath.floor(x)xに相当する| x> = 0の場合は0?
-
29-10-2019 - |
質問
次の例を見ると、次のようになります Math.floor(x)
と同等です x | 0
, 、 のために x >= 0
. 。それは本当ですか?「はい」の場合、その理由は何ですか?(またはどのように x | 0
計算されてる?)
x = -2.9; console.log(Math.floor(x) + ", " + (x | 0)); // -3, -2
x = -2.3; console.log(Math.floor(x) + ", " + (x | 0)); // -3, -2
x = -2; console.log(Math.floor(x) + ", " + (x | 0)); // -2, -2
x = -0.5; console.log(Math.floor(x) + ", " + (x | 0)); // -1, 0
x = 0; console.log(Math.floor(x) + ", " + (x | 0)); // 0, 0
x = 0.5; console.log(Math.floor(x) + ", " + (x | 0)); // 0, 0
x = 2; console.log(Math.floor(x) + ", " + (x | 0)); // 2, 2
x = 2.3; console.log(Math.floor(x) + ", " + (x | 0)); // 2, 2
x = 2.9; console.log(Math.floor(x) + ", " + (x | 0)); // 2, 2
x = 3.1; console.log(Math.floor(x) + ", " + (x | 0)); // 3, 3
これは、JavaScript で整数の除算を実行する場合に役立ちます。 (5 / 3) | 0
それよりも Math.floor(5 / 3)
.
解決
ビット演算子は数値を32ビットシーケンスに変換します。だからあなたが提案している代替案は、正の署名された32ビットフロート、すなわち0
から+2,147,483,647
(2^31-1
)への数値でのみ動作します。
Math.floor(2147483646.4); // 2147483647
2147483646.4 | 0; // 2147483647
// but…
Math.floor(2147483648.4); // 2147483648
2147483648.4 | 0; // -2147483648
.
別の違い:x
が数値ではない場合、x | 0
の結果はMath.floor(x)
の結果とは異なる場合があります。
Math.floor(NaN); // NaN
NaN | 0; // 0
.
それ以外の結果は、正数が使用されている限り、Math.floor()
の結果と似ているはずです。
これはいくつかの例で+パフォーマンステストです: http://jsperf.com/rounding-numbers-down
他のヒント
ECMAScript仕様に従い、§11.10バイナリビット単位演算子: ジェネラコディセタグプレ
これは、x | y
の計算方法です。
x
とy
は、Int32
に解析されてから、|
演算子を適用します。
JS のビット単位の操作は 32 ビットです。つまり、float は最初に「int」に「キャスト」されます。
"2.6" | 0 = 2
ということを示唆している parseInt
呼ばれています。
垂直バーはビット単位の演算子です。0のビットはすべてゼロであるため、x|0
は理論的には何もしません。ただし、それを評価するには、オペランドが整数である必要があるため、x
を最初に浮動小数点から整数に変換する必要があります。変換は小数部分を削除することによって行われるため、はい、一部のx>= 0に対して、x|0
== Math.floor(x)
があります。
結果は、内部整数型のサイズと符号によって異なることに注意してください。たとえば、次のようになります。 ジェネラコディセタグプレ
(x | 0)は、「。」の後のビットを削除するため、次の真の関係を取得できます。 ジェネラコディセタグプレ
x >> 0はxと同じ効果があります|0なので: ジェネラコディセタグプレ