2013-05-11 71 views
0

我需要將64位整數的第n位設置爲1; 有一個內在的(這裏http://msdn.microsoft.com/en-us/library/z56sc6y4(v=vs.90).aspx記錄):Visual Studio C編譯器中是否存在單獨的bitset64內部函數?

unsigned char _bittestandset64(
__int64 *a, 
__int64 b 
); 

該做的工作。 我的問題是如果有一種方法只是做位設置(沒有測試),並且如果使用bittestandset64忽略返回值的任何性能命中爲目的。
我也有興趣,如果有一種方法可以在GCC中使用(用於Intel Core2至i7)。

回答

1

內在點是利用特定的處理器指令,並使用選項來繼續優化代碼。在這種情況下,BTS,位測試和設置指令。沒有專門的「位設置」指令。代碼生成器將使用結果值關注您。如果您不使用它,那麼它也不會生成將進位標誌轉換爲位值的代碼。

所以一組簡單的,如:

_bittestandset64(&bits, 1); 

生產:

000007F6ED6812CE bts   qword ptr [rax],1 

當使用結果值,如:

unsigned char value = _bittestandset64(&bits, 1); 

生產:

000007F7394E14A3 bts   qword ptr [rax],1 
000007F7394E14A8 setb  al 
000007F7394E14AB mov   byte ptr [value],al 

你不可能比單個cpu指令做得更好,這已經很好了。

+0

我不知道如果我不使用返回值會產生什麼。這解決了我的問題。 – 2013-05-12 05:59:10

相關問題