2009-06-25 7 views
6

私は3.0のコードなどの一部ではこの出くわした:期間はNumberあるAS3ビットシフト0?

(duration >> 0) 

。私はbitwise right shiftが何をするのか知っていると思うが、0ビットをシフトするのは何ですか?これはコードで数回発生しますが、私はそれが何かを理解したいと思います。

+0

の方向に私はいくつかがちょうどどのような作品に打撃:( – leppie

+0

、コーディングする方法を推測していると思います。より多くの理にかなって、それはないだろうが、その後、質問はしていました:?? – grapefrukt

答えて

8

を、このためのいくつかの理由があります。..

はまず、乗算、除算は、いくつかの状況では、実際に高速です 我々は左シフトを使用する場合、右シフト...

バイナリの番号1すなわち

は、それが00000010になるために、左00000001 シフトであり、それは...今では二回掛けるすなわち1×2

シフト/除算2です4倍、8倍、3倍、16倍など。

これはあまり頻繁には使用されませんが、C/C++の物理エンジンポートのような大量のデータを処理する場合や、 3dエンジンでは、元のコードを思い起こさせるためのシフト、または単に速度のシフトを見ます。

(たとえば、J2MEモバイルJavaゲームでも浮動小数点ユニットが使用できない場合があります。つまり、値を10ビット左にシフトすると残りの10ビットは小数点のように動作します。可能な限り全体的なサイズを犠牲にして、スクリーン位置に描画するときの実際の値に戻ります)

上記の他の使用方法は、簡単なMath.floor()です。しかし、重要な違いがある。 私はいくつかのベンチマークをBox2Dで数ヶ月前に行いましたが、両方の変換がネイティブに処理されていると仮定しているので、何百倍も早く奇妙です。

負の数を丸める、
Math.floor(-7.6)= -8 及び(-7。6 < < 0)= -7

すなわちあなたの周りに、我々はより多くを持っています線の一部を示す場合数(フロート)に< < 0はラウンド0

3

時には、あなただけの完全性のために列挙型でこれを参照してください、すなわち

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

などでしょう。コードでこの問題が発生した場合は、実際にシフトする必要があるとき(テスト、変更された要件)から少し残っていることが予想されます。もちろん、この演算子がAS3のシフト演算子でない場合は、そうです。たとえば、C++では、入力ストリーム演算子としても使用されます(入力をある変数にシフトしているため)。

+1

>>から推測すると、あなたは –

+0

でビットシフト演算子であります'>>';) – Tim

+1

@Tim Nordenfur( '<<')左シフトをもしかして間違いなくAS3 – OregonGhost

4

Math.floor()を呼び出すオーバーヘッドがなくても小数点以下を取り除くのは難しいかもしれません。なぜなら、Numberを入力としても整数を返すからです。

私はこれが(より一般的に見て)やってに賢明パフォーマンスを比較するかどうかはわかりませんがintにキャスト(x)は、(x)はint型を使用して変換 を整数へ

関連する問題