トップ

yが偶数のときrが0になり、yが奇数のときにrが定数Aになる式

メルセンヌ・ツイスタ、TGFSR、TTGFSRで必要となる式。いろいろな方法がある。
A、y、r は unsigned としている。

(1)配列を使う

    static unsigned m[]={0,A};
    r=m[y&1];
オリジナルのメルセンヌ・ツイスタが使用している方法。 分岐予測がないので高速。 ただし、C#やJAVAなど配列の範囲チェックをしている処理系では遅い。

(2)掛け算を使う

    r=(y&1)*A;
もっとも分かりやすい。分岐予測がない。しかし、掛け算が相対的に遅くなるC/C++には向いていない。

(3)三項演算子を使う

    r=(y&1?A:0);
これも分かりやすい。ただし、分岐予測がある。

(4)負の変換を使う

    r=-((int)(y&1))&A;
コンパイラが x86のマシン語 neg を吐き出せば非常に高速。お勧めの方法。

(5)シフトを使う

    r=(int)(y<<31)>>31&A;
負の変換命令がないSSE2で高速。

どれが速いか比較するプログラム

tsc.c