JavaScriptビット演算ノート


jsのビット演算では、ダブル精度の浮動小数点数は内部で32ビットの整数に変換されてビット演算を行い、64ビットの数値に変換されるので、効率が非常に低いと考えられていました.今日の実験では、浮動小数点に対してビット演算を行うと、数値が不正確になるだけで、効率が低下することはなく、乗算よりも左シフトが66%速いことが分かりました.
以下の結果はIE 7~IE 10でテストします.
テクニック1:シフト演算は乗算よりも速い(因数は2のべき数)
<!-- lang: js -->
b = a << 1;
大体6.8%速いです
テクニック2:パリティ判定
<!-- lang: js -->
b = a & 1;
0位は1と比べて、x%2より、約35%速いです.
テクニック3:二つの数字の符号が同じかどうかを判断する
<!-- lang: js -->
(a ^ b) >= 0
に比べて
<!-- lang: js -->
if ( a == 0 )
    return 1;
else if ( a > 0 )
    return b >= 0;
else
    return b <= 0;
その効率は基本的に同じですが、もっと簡潔です.
に比べて
<!-- lang: js -->
(a * b) >= 0;
オーバーフローの問題はありません.
テクニック4:一つの数が2のべき乗かどうかを判断します.
<!-- lang: js -->
(a & (a - 1)) == 0;