6

ES6 に新しい数学メソッドがあることがわかりました: Math.trunc.

MDN の記事でその説明を読みましたが、 を使用しているように思えます|0

さらに、<<0>>0、も同様のことを行います (thanks @kojiro & @Bergi) &-1^0

いくつかのテストの後、唯一の違いは次のようです。

  • Math.trunc-0interval に数値を返します(-1,-0]。ビット演算子は を返し0ます。
  • Math.truncNaN非数値で返します。ビット演算子は を返し0ます。

(それらすべての中で)さらに違いはありますか?


n      | Math.trunc | Bitwise operators
----------------------------------------
42.84  | 42         | 42
13.37  | 13         | 13
0.123  | 0          | 0
0      | 0          | 0
-0     | -0         | 0
-0.123 | -0         | 0
-42.84 | -42        | -42
NaN    | NaN        | 0
"foo"  | NaN        | 0
void(0)| NaN        | 0
4

2 に答える 2

4

Math.trunc(Math.pow(2,31))vs.どうですか?Math.pow(2,31) | 0

ビット演算は、符号付き 32 ビット整数に対して実行されます。したがって、Math.pow(2, 31) を実行すると、この表現がビット "100000000000000000000000000000" で取得されます。この数値は符号付き 32 ビット形式に変換する必要があるため、符号ビット位置が 1 になります。これは、符号付き 32 ビット形式で -eve 数を見ていることを意味します。次に、ビット単位の OR を 0 で実行すると、符号付き 32 ビット形式で同じ結果が得られます。10 進数では -2147483648 です。

補足:符号付き 32 ビット形式では、バイナリで表現できる 10 進数の範囲は [1000000000000000000000000000000, 01111111111111111111111111111] です。10 進数 (基数 10) では、この範囲は [-2147483648, 2147483647] です。

于 2014-03-03T20:42:29.117 に答える
1

ビット単位の演算子を使用する多くのプログラミング言語では、整数以外でビット単位の操作を実行しようとすると、型エラーになります。

>>> # Python
>>> 1 << 0; 1.2 << 0
1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<: 'float' and 'int'

ECMA-262では、数値は倍精度の 64 ビット バイナリ形式 IEEE 754 です。つまり、JavaScript には整数はありません。扱っている値が収まる限り-(Math.pow(2,32))Math.pow(2,31)ビット演算は浮動小数点値を切り捨てるための高速な方法です。さまざまなビット演算はすべて異なることを行いますが、ここに示すすべての例では、本質的に恒等演算を行っています。重要な違いは、JavaScript がToInt32何もしない部分を実行する前に値に対して操作を実行することです。

ビット単位の ID 操作:

i |  0 // For each bit that is 1, return 1|0. For each bit that is 0, return 0|0.
i ^  0 // xor, but effectively same as previous.
i << 0 // Shift the value left zero bits.
i >> 0 // Shift the value right zero bits.
i & -1 // Identity mask
~~i    // Not not - I had forgotten this one above.
于 2014-03-04T02:53:28.380 に答える