2013-11-24 93 views
3

是否有一種有效的方法來獲得0x00000001或0xFFFFFFFF爲非零無符號整數,而0爲零整數沒有分支? 我想測試幾個蒙版,並基於此創建另一個蒙版。基本上,我想優化下面的代碼:將位向量轉換爲一位

unsigned getMask(unsigned x, unsigned masks[4]) 
{ 
    return (x & masks[0] ? 1 : 0) | (x & masks[1] ? 2 : 0) | 
      (x & masks[2] ? 4 : 0) | (x & masks[3] ? 8 : 0); 
} 

我知道,有些優化編譯器可以處理這個問題,但即使是這樣的話,究竟他們是如何做到的呢?我查看了'Bit Twiddling hacks'頁面,但是僅使用布爾條件發現了條件設置/清除掩碼的描述,所以從int到bool的轉換應該在方法之外完成。如果沒有通用的方法來解決這個問題,那麼我怎樣才能高效地使用x86彙編代碼呢?謝謝!

回答

1

的常用方法中的x86做到這一點是:

test eax, eax 
setne al 
+0

但是這是很難網點。 – 2013-11-24 08:55:44

+2

我在這裏解釋無分支,因爲沒有jmp指令。轉移和xor黑客可能會變慢。 – simonzack

+0

謝謝!順便說一句,你爲什麼相信它幾乎沒有分支? 'setne'是一個耗時的操作嗎? – bkxp