私の以前の質問 ( JavaScript でランダムな整数を生成する最速の方法は何ですか? ) に対する受け入れられた回答では、シンボルを介して数値がどのように小数を失うのか疑問に思っていました|
。
例えば:
var x = 5.12042;
x = x|0;
その数をどのように床に置くの5
ですか?
いくつかの例:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
私の以前の質問 ( JavaScript でランダムな整数を生成する最速の方法は何ですか? ) に対する受け入れられた回答では、シンボルを介して数値がどのように小数を失うのか疑問に思っていました|
。
例えば:
var x = 5.12042;
x = x|0;
その数をどのように床に置くの5
ですか?
いくつかの例:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
なぜなら、ECMAScript 仕様によると、ビット単位の演算子 operator はToInt32
、評価される各式を呼び出すからです。
11.10 二項ビット演算子を参照してください。
上記のプロダクションのビット演算子の 1 つ
A : A @B
で@
あるプロダクションは、次のように評価されます。
評価し
A
ます。コールし
GetValue(Result(1))
ます。評価し
B
ます。コールし
GetValue(Result(3))
ます。電話
ToInt32(Result(2)).
電話
ToInt32(Result(4)).
とにビット演算子
@
を適用Result(5)
しResult(6)
ます。結果は符号付き 32 ビット整数です。戻る
Result(7)
。
ビット演算子は引数を整数に変換します ( http://es5.github.com/#x9.5を参照)。私が知っているほとんどの言語は、このタイプの変換をサポートしていません。
$ python -c "1.0|0" トレースバック (最新の呼び出しが最後): ファイル ""、1 行目、 TypeError: サポートされていないオペランド型 |: 'float' および 'int' $ ruby -e '1.0|0' -e:1:in `': 未定義のメソッド `|' for 1.0:Float (NoMethodError) $ echo "int main(){1.0|0;}" | gcc -xc - : 関数 'main' 内: :1: エラー: バイナリへの無効なオペランド | ('double' と 'int' があります)
を実行する場合floor
、引数を整数に変換することは可能ですが、元の型が浮動小数点数であるため、これはほとんどの言語が行うことではありません。
データ型を維持しながらそれを行うより良い方法は、exponent
数字をに移動しmantissa
、残りのビットをゼロにすることです。
興味がある場合は、IEEE 仕様の浮動小数点数を参照してください。