amachangの"~~"以外で、Math.floor を使わずに小数を整数にしてみた
id:amachangの発見
全ての数値演算を浮動小数点演算で行う言語仕様のJavaScriptでも、ビット演算を行う際にオペランドを得るために整数化が行われ、それを悪用するとw Math.floor()の代わりになる。
値不変のビット演算って
思いつくのは下記の4通りです。
<html> <head> <title>整数化のテスト</title> </head> <body> <script type="text/javascript" language="javascript"> // 前準備 var floating_point_value = 3.14159; // その1:論理積 alert(floating_point_value & -1); // その2:論理和 alert(floating_point_value | 0); // その3:排他的論理和 alert(floating_point_value ^ 0); // その4:ビット反転×2回 alert(~~floating_point_value); </script> </body> </html>
機械語レベルで考えると、1〜3は演算が1回の代わりにメモリからイミディエイトオペランドのロードが発生するが、4は演算が2回の代わりにレジスタのみで演算が完結すると一長一短です。で、JavaScriptではどうなるのかベンチマークを取ってみないと判りません。
おそらく、1〜3は同じスコアになりそうな気がするんですけどね。。。