2

我正在尝试优化一些代码,这看起来很简单,但让我很难过。所以基本上,我试图将一个数字设为 1,如果它大于 0。问题是我不想使用任何比较,因为它们非常昂贵,并且在没有比较的情况下获得解决方案会拯救我40 秒,因为它被调用了很多。所以我想要的只是位操作符,加法、减法、除法和乘法。

额外:这个数字永远只有 1 或 2。

类型是unsigned int

完整算法:

        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 回答