2012-07-29 173 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,它也將與更多的價值的工作,但是這不是我關心的。