AS 3.0コードでこれに出くわしました:
(duration >> 0)
期間はNumber
. ビットごとの右シフトが何をするかはわかっていると思いますが、0 ビットをシフトするポイントは何ですか? これはコード内で数回発生します。その動作を理解したいと思います。
AS 3.0コードでこれに出くわしました:
(duration >> 0)
期間はNumber
. ビットごとの右シフトが何をするかはわかっていると思いますが、0 ビットをシフトするポイントは何ですか? これはコード内で数回発生します。その動作を理解したいと思います。
int(x)を使用した数値から整数への変換は、AS3で10%高速です。それでも、ビット単位のバージョンはAS2でより適切に機能します。
x = int(1.232)
//等しい:x = 1.232 >> 0;
最もよく説明されている:http://lab.polygonal.de/2007/05/10/bitwise-gems-fast-integer-math/das
これにはいくつかの理由があります..
まず、乗算と除算は、左シフト、右シフトを使用すると、状況によっては実際に高速になります...
つまり、2 進数の 1 は 00000001 です。左にシフトして 00000010 になると、2 になります。つまり、1 x 2
4 で乗算/除算するには 2 回シフトし、8 の場合は 3 回、16 の場合は 4 回など...
あまり頻繁に使用されるわけではありませんが、C/C++ からの物理エンジンの移植、膨大な量のデータの処理、または一部の 3D エンジンの場合、シフトは元のコードの名残として、または単に速度のために見られます。
(たとえば、一部の J2ME モバイル Java ゲームでも見られる場合があります。ここでは、浮動小数点単位が使用できません。つまり、値を 10 ビット左にシフトし、残りの 10 ビットが一種の小数点のように機能するようにします。全体の可能なサイズを犠牲にして、画面位置に描画するときの実際の値)
前述の他の用途は、素早い Math.floor(); です。- しかし、重要な違いがあります。数か月前に Box2D を使用していくつかのベンチマークを行ったところ、何百倍も高速であることがわかりました。両方の変換がネイティブに処理されると想定しているため、奇妙です。
負の数値を丸める場合、
Math.floor(-7.6) = -8 および (-7.6 <<0 ) = -7
つまり、Number (float) の <<0 は、0 の方向に丸められます。
入力として数値を使用しても整数が返されるため、 Math.floor() の呼び出しのオーバーヘッドなしで小数を取り除くのはトリックかもしれません。
これが(より一般的に見られる)int(x)へのキャストを行うこととパフォーマンスをどのように比較するかはわかりません
完全を期すために、これを列挙型で表示することがあります。
flag0 = 1 >> 0,
flag1 = 1 >> 1,
flag2 = 1 >> 2
等々。コードでこれに遭遇した場合は、実際に移行する必要があったとき (テスト、要件の変更) からの残り物であると思われます。もちろん、この演算子が AS3 のシフト演算子ではない場合を除きます。たとえば、C++ では、入力ストリーム演算子としても使用されます (入力を変数にシフトしているためです。ため息)。