【发布时间】:2012-07-29 03:09:55
【问题描述】:
我正在尝试优化一些代码,这看起来很简单,但给我带来了困难。 所以基本上,我试图将一个数字设为 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;
}
}
【问题讨论】:
-
如果数为2,则变为1。如果为1,则仍为1,有什么区别?
-
类型是无符号整数。另外,如果只有位运算符为 2,我将如何使数字为 1?
-
班次。但我不确定你如何知道是否需要换档,除非你进行比较。
-
是的,这就是问题所在。我避免进行任何比较。
-
你的要求太荒谬了。如果不进行某种比较,就无法判断一个数字是否大于零。这个问题甚至没有意义,简单的整数
CMP操作并不昂贵。这是一个毫无意义的优化案例。
标签: c math optimization