2009-09-21 15 views

答えて

17

* 2コールを最適化しない古いコンパイラでは、左シフト命令を発行する方が高速です。その最適化は本当に検出が容易で、まともなコンパイラはすでにそうです。

読みやすさに影響する場合は、使用しないでください。最も明快で簡潔な方法でコードを書いてください。スピードの問題があれば、プロファイリングして手の最適化を行ってください。

2

一部のアーキテクチャでは、ビットシフトは乗算より高速です。しかし、その塩の価値があるコンパイラは、左のビットシフト(ビットシフトが速い場合)に対して* 2(または2のべき乗による任意の乗算)を最適化します。

1

古いCコンパイラを使用している場合は、ビット単位で使用することをお勧めします。読みやすくするために、あなたはコードをコメントすることができます。

22

乗算するときは*を使用し、ビットシフトするときは< <を使用します。それらは数学的には同等ですが、意味の意味が異なります。たとえば、フラグフィールドを作成する場合は、ビットシフトを使用します。合計を計算する場合は、乗算を使用します。

+0

非常に良い点。ビットを1つ左に移動したい場合は、 '<< 1'を使います。 2倍の大きさにしたい場合は、 '* 2'を使います。同じ効果がありますが、数字を使用しているものははっきりとわかります。 – nickf

+2

+1。あなたのコードに** intent **を表現し、コードをプロファイリングしていない限り、コンパイラを推測しないでください。 –

6

これは、作業するデータの個々のビットに関係する場合に使用します。あなたは0x9Aにワードの上位バイトを設定したい場合たとえば、あなたはあなたが書きたい

n |= 0x9A * 256 

を書きません:

n |= 0x9A << 8 

これは、あなたが作業しているということが明確になりますビットで表現されています。ビットフィールドとして使用される値の可読性のため

2

:私はどちらか '= 1、...、= 2、... = 4' または「= 1に好適であると考え

enum Flags { UP  = (1<<0), 
      DOWN  = (1<<1), 
      STRANGE = (1<<2), 
      CHARM = (1<<3), 
      ... 

、.. 。= 2、= 2 * 2、... = 2 * 3 '特に8+のフラグがある場合。

関連する問題