6

AS 3.0コードでこれに出くわしました:

(duration >> 0)

期間はNumber. ビットごとの右シフトが何をするかはわかっていると思いますが、0 ビットをシフトするポイントは何ですか? これはコード内で数回発生します。その動作を理解したいと思います。

4

4 に答える 4

8

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

于 2009-08-12T12:04:28.110 に答える
8

これにはいくつかの理由があります..

まず、乗算と除算は、左シフト、右シフトを使用すると、状況によっては実際に高速になります...

つまり、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 の方向に丸められます。

于 2010-12-06T19:46:36.717 に答える
4

入力として数値を使用しても整数が返されるため、 Math.floor() の呼び出しのオーバーヘッドなしで小数を取り除くのはトリックかもしれません。

これが(より一般的に見られる)int(x)へのキャストを行うこととパフォーマンスをどのように比較するかはわかりません

于 2009-06-25T11:38:17.220 に答える
3

完全を期すために、これを列挙型で表示することがあります。

flag0 = 1 >> 0,
flag1 = 1 >> 1,
flag2 = 1 >> 2

等々。コードでこれに遭遇した場合は、実際に移行する必要があったとき (テスト、要件の変更) からの残り物であると思われます。もちろん、この演算子が AS3 のシフト演算子ではない場合を除きます。たとえば、C++ では、入力ストリーム演算子としても使用されます (入力を変数にシフトしているためです。ため息)。

于 2009-06-25T10:16:56.853 に答える