我正在尝试优化一些代码,这似乎很简单,但却让我很难过。 所以基本上,我试图将数字设为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;
}
}
答案 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.它也可以使用更多的值,但这不是我的关注。