2

私はいくつかのコードを最適化しようとしています。それは単純に見えますが、私に苦労しています。したがって、基本的に、0より大きい場合は、数値を1にしようとしています。問題は、比較を使用たくないということです。比較は非常に高価であり、比較なしで解決策を取得すると節約できるからです。それがたくさん呼ばれるようになるので40秒。だから私が欲しいのはビット単位の演算子、足し算、引き算、割り算、掛け算だけです。

追加:数は1または2になります。

タイプはunsignedintです。

完全なアルゴリズム:

        DWORD num = (blockNum / 0xAA) * blockStep[0];

        switch (blockNum / 0xAA)
        {
            case 0:
                return num + hashOffset;

            default:

                num += ((blockNum / 0x70E4) + 1) << (BYTE)packageSex;
                switch (blockNum / 0x70E4)
                {
                    case 0:
                        return num + hashOffset;

                    default:
                        return num + (1 << (BYTE)packageSex) + hashOffset;
                }
        }
4

3 に答える 3

14

このコードスニペットは、必要な効果を生み出します。アセンブリ出力(MSVC ++ 2010)を確認しましたが、ブランチレスです。

n = !!n;
于 2012-07-29T03:31:23.777 に答える
5

1または2のみであることが保証されている場合、これは非常に簡単です。

1:0001 2:0010

右シフトとORを適用することにより、両方とも1でマスクされ、常に1になります。

数値がvalに格納されているとしましょう。

val = (val | val>>1) & 1
于 2012-07-29T03:25:43.640 に答える
1
(num & 1) | ((num & 2) >> 1)

私がやろうとしていること、つまり値1と2で機能します。それは、より多くの値でも機能しますが、それは私の関心事ではありません。

于 2012-07-29T03:26:44.333 に答える