如何實現用非常快的英特爾POPCNT指令16/32/64位字中的1位的計數,在德爾福XE或XE2?是否有一個庫函數直接訪問這條指令?有人可以寫一個演示asm部分說明它的使用嗎? 最後,有什麼選擇64位德爾福(沒有asm可用)? 在此先感謝 tPOPCNT在Delphi XE/XE2 64
回答
隨着羅布肯尼迪擁塞,在這裏你有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;
最後一個看起來狡猾,可能會運行在一個32位值,並存儲在一個64位?要麼取消高位32位或將其聲明爲int64? –
@Marco van de Voort謝謝,是的,它默認是32位,但是你可以將num聲明爲'NativeInt'或'Int64'或'UInt64',而不是它與所有的tham一起工作。更正爲Int64! –
如果使用變量int大小,則還需要ifdef在popcnt行中的寄存器。 –
- 1. OpenCL:GPU上的32位和64位popcnt指令?
- 2. 轉換爲Delphi 64位?
- 3. OCaml是否有popcnt功能?
- 4. TADOConnection在delphi xe2中不工作64位
- 5. Delphi 64位NaN和無效浮點數
- 6. 64位的UAC提升的Delphi清單
- 7. {$ SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE} 64位delphi應用程序
- 8. 如何在DELPHI XE6中製作32位和64位Delphi應用程序?
- 9. 當在64位中加載64位c DLL時產生Enum問題Delphi
- 10. 如何在計算機上啓用對POPCNT指令/內在的支持?
- 11. 在Windows 7 64位企業版上安裝Delphi 2007的問題
- 12. 在Windows Vista 64位下使用命令行編譯Delphi 2009
- 13. 在Windows 7上的Delphi MapiSendMail崩潰64位
- 14. 不能在win7上使用Delphi 2007 64位
- 15. 關於Delphi和C++在64位環境中的枚舉
- 16. 在Delphi
- 17. 如何在64位Delphi項目中使用64位bass.dll時在啓動時修復應用程序崩潰?
- 18. 德爾福32到Delphi XE2(64位)轉換
- 19. Delphi XE - W7/64虛擬機上的安裝問題
- 20. 運行Delphi 2009應用程序時Vista 64位BSOD
- 21. Delphi與Windows 2008 Server 64位的兼容性
- 22. Delphi 7 32位執行並等待64位進程
- 23. 什麼是delphi 64位程序集中的.noframe?
- 24. 無法刪除Delphi 7中的64位註冊表鍵
- 25. 遷移從32位[Delphi的7]到64位
- 26. 整型()類型的流延不Delphi的64位
- 27. Delphi XE2/64位目標地址可以1TB的內存?
- 28. 64位的Delphi 5出現內存錯誤
- 29. 用於Delphi xe的64位Oracle客戶端
- 30. 爲什麼64位COM DLL無法使用Delphi XE3註冊
ASM是64位的Delphi avaible爲好。 – Giel
我想這不像只是在asm塊中寫入'popcnt eax,eax'或'popcnt rax,rcx'這麼簡單,是嗎? –
稍微偏離主題:http://www.strchr.com/crc32_popcnt具有POPCNT實施方式中,其中a SSSE3('pshufb'爲半字節表查找)變體實際節拍在某些系統'popcnt'的比較表。只有幾個%,在所有CPU上不一定相同,並且只有在您處理大量(100 + Bytes)數據量時纔有用。 _非常fast_是相對的。 –