2012-05-29 116 views
5

如何實現用非常快的英特爾POPCNT指令16/32/64位字中的1位的計數,在德爾福XE或XE2?是否有一個庫函數直接訪問這條指令?有人可以寫一個演示asm部分說明它的使用嗎? 最後,有什麼選擇64位德爾福(沒有asm可用)? 在此先感謝 tPOPCNT在Delphi XE/XE2 64

+1

ASM是64位的Delphi avaible爲好。 – Giel

+0

我想這不像只是在asm塊中寫入'popcnt eax,eax'或'popcnt rax,rcx'這麼簡單,是嗎? –

+1

稍微偏離主題:http://www.strchr.com/crc32_popcnt具有POPCNT實施方式中,其中a SSSE3('pshufb'爲半字節表查找)變體實際節拍在某些系統'popcnt'的比較表。只有幾個%,在所有CPU上不一定相同,並且只有在您處理大量(100 + Bytes)數據量時纔有用。 _非常fast_是相對的。 –

回答

2

隨着羅布肯尼迪擁塞,在這裏你有32位和64位Delphi IDE功能。

function GetBitCount(num: integer): integer; 
asm 
    POPCNT eax, num 
end; 

function GetBitCount(num: Int64): integer; 
asm 
    POPCNT rax, num 
end; 

編輯: 這是32位和64位的Delphi兼容版本

{$IF CompilerVersion < 23} //pre-XE2 
    NativeInt = integer; 
{$IFEND} 

function GetBitCount(num: NativeInt): integer; 
asm 
{$IFNDEF CPUX64} 
    POPCNT eax, num 
{$ELSE CPUX64} 
    POPCNT rax, num 
{$ENDIF CPUX64} 
end; 
+0

最後一個看起來狡猾,可能會運行在一個32位值,並存儲在一個64位?要麼取消高位32位或將其聲明爲int64? –

+0

@Marco van de Voort謝謝,是的,它默認是32位,但是你可以將num聲明爲'NativeInt'或'Int64'或'UInt64',而不是它與所有的tham一起工作。更正爲Int64! –

+0

如果使用變量int大小,則還需要ifdef在popcnt行中的寄存器。 –

相關問題