ビット演算のTips集。
The Aggregate Magic Algorithms

DSPのようにパイプラインが深いCUPの場合*1、if文などの条件分岐があるとせっかくパイプラインに先読みしてあった命令が全てキャンセルされて時間ロスが生じる。なのでソフトウェアの時間制約が厳しい場合は極力条件文を避ける必要がある。
例えば、xの絶対値をyに代入する場合、

float x, y;
if (x < 0) {
    y = x * -1;
} else {
    y = x;
}

の代わりに

float x, y;
y = x;
*((int *) &y) &= 0x7fffffff;

のように書くと速度が向上する場合がある*2
なのでDSPのプログラムを書くときにはビット演算は知っておいて損は無い。

(追記)
手元のDSPで実測してみた。CUPサイクル数と処理時間はif文の場合を基準に差分で表示してある。

方法サイクル数処理時間[ns]
if文00
fabs()-384-575
ビット演算-400-599

*1:今使っているDSPのパイプラインは8

*2:intとfloatが共に32bitで、floatの内部表現がIEEE不動小数型である処理系を想定している。