如果大于0,则使数字1

时间:2012-07-29 03:09:56

标签: c math optimization

我正在尝试优化一些代码,这似乎很简单,但却让我很难过。 所以基本上,我试图将数字设为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;
                }
        }

3 个答案:

答案 0 :(得分:14)

此代码段会产生您想要的效果。我检查了程序集输出(MSVC ++ 2010),它是无分支的。

n = !!n;

答案 1 :(得分:5)

如果保证它只能是1或2,那么这很简单:

1:0001 2:0010

通过应用右移和自身的OR,两者都用1掩盖,它总是一个

假设数字存储在val中,然后

val = (val | val>>1) & 1

答案 2 :(得分:1)

(num & 1) | ((num & 2) >> 1)

适用于我想要做的事情,即值1和2.它也可以使用更多的值,但这不是我的关注。