如果大于0,则使数字1

het*_*lek 2 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;
                }
        }
Run Code Online (Sandbox Code Playgroud)

Bla*_*ace 14

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

n = !!n;
Run Code Online (Sandbox Code Playgroud)

  • 尊重,我建议不要采取"这非常缓慢"的立场,而应该像我们其他人一样采取立场"我可能正在做一些愚蠢的事". (3认同)

Leg*_*air 5

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

1:0001 2:0010

通过应用右移和OR本身,两者都用1掩盖,它将永远是一个

让我们说数字存储在val中,然后

val = (val | val>>1) & 1
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我快了20秒;-) (3认同)
  • 这不起作用.2 | (2 >> 1)= 2 | 1 = 3. (2认同)