2012-07-29 174 views
2

我想优化一些代码,这看起来很简单,但给我很难。 所以基本上,我试图让一个数字的值为1,如果它大于0.问题是我不想使用任何比较,因为它们是非常昂贵的,得到一个没有比较会节省我40秒,因为它被称为很多。所以我想要的是比较明智​​的操作员,加,减,除,乘。如果大于0,则为1 1

额外:数量将永远仅是1或2

的类型是无符号整型

全算法:

 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; 
       } 
     } 
+1

所以类型是'int',那么? – 2012-07-29 03:11:46

+2

如果数字是2,则它变为1.如果它是1,则它保持为1.有什么区别? – ghoti 2012-07-29 03:12:00

+0

该类型是一个无符号整数。另外,如果数字为2且只有位运算符,我将如何获得数字1? – hetelek 2012-07-29 03:13:16

回答

14

此代码片断会产生所需的效果。我检查了汇编输出(MSVC++ 2010),它是无分支的。

n = !!n; 
+0

非常好,完美的解决方案为unsigned int。当您打开优化时会发生什么,我可以看到它可能会优化的位置。挥发性的帮助在这里? – 2012-07-29 04:04:51

+0

这是一个很好的解决方案,但它仍然做比较。有了这个说法,这也很慢。 – hetelek 2012-07-29 04:12:45

+0

你确定,理想情况下这将是两个NOT汇编指令寄存器 – 2012-07-29 04:15:55

5

如果guarantied,它只能是1或2,那么这是非常简单:

1:0001 2:0010

通过施加一个右移和OR本身,都掩盖1,它将永远是一个

可以说数量存储在VAL,然后

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

明白了吧:)谢谢。 – hetelek 2012-07-29 03:27:17

+3

嘿,我快了20秒;-) – Legionair 2012-07-29 03:29:48

+2

这是行不通的。 2 | (2 >> 1)= 2 | 1 = 3. – 2012-07-29 03:31:15

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

Works的什么,我试图做的,这是值1和2,它也将与更多的价值的工作,但是这不是我关心的。