¿Cómo implemento un recuento de 1 bits en una palabra de 16/32/64 bits utilizando la instrucción Intel POPCNT muy rápida, en Delphi XE o XE2? ¿Hay una rutina de biblioteca que dé acceso directo a esta instrucción? ¿Puede alguien escribir una sección de demostración de asm que ilustre su uso, por favor? Y, por último, ¿cuáles son las opciones para Delphi de 64 bits (sin asm disponible)? gracias de antemano tPOPCNT en Delphi XE/XE2 64bit
Respuesta
Como Rob Kennedy ha sugerido, aquí tiene funciones para Delphi IDE de 32 bits y 64 bits.
function GetBitCount(num: integer): integer;
asm
POPCNT eax, num
end;
function GetBitCount(num: Int64): integer;
asm
POPCNT rax, num
end;
EDIT: Este es de 32 bits y de 64 bits Delphi versión compatible
{$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;
Este último parece dudoso, probablemente funcionará con un valor de 32 bits y se almacenará en uno de 64 bits. ¿Desea cero a la parte superior de 32 bits o la declara como int64? –
@Marco van de Voort Gracias, sí, es de 32 bits por defecto, pero puede declarar num como 'NativeInt' o' Int64' o 'UInt64' en su lugar, funciona con todos los tham. Corregido a Int64! –
Si usa un tamaño int variable, también necesita ifdef el registro en la línea popcnt. –
- 1. 64bit Asignación de memoria
- 2. ejecutando PIL en 64bit
- 3. int vs size_t en 64bit
- 4. Detecta IE8 64bit en Javascript
- 5. ¿Los parámetros de constricción y el encasillado funcionarán como antes en Delphi 64bit?
- 6. MXMLC y 64bit JRE
- 7. Long type 64bit linux
- 8. JDK 64bit o 32bit?
- 9. ¿Soporta Mono 64bit Windows?
- 10. 64bit Enums? C#
- 11. 64bit .NET Ajuste de rendimiento
- 12. phpredis en windows 7 64bit xampp
- 13. Inno-setup 32bit y 64bit en uno
- 14. Printf con typedef enteros, especialmente 64bit
- 15. Archivo DLL para Windows 7 64bit
- 16. 32Bit Native Code, JNA y 64Bit JVM
- 17. compilación XCode para Intel 32-64bit solo
- 18. Java y Eclipse - 32 vs 64bit
- 19. Oracle 11g Express Edition para Windows 64bit?
- 20. Construyendo 64bit libpython27.a usando cygwin, dlltool
- 21. C - win32: AttachThreadInput & SetFocus, 64bit: ninguna pista
- 22. Debo usar Python 32bit o Python 64bit
- 23. OpenCL: instrucción popcnt de 32 bits y 64 bits en la GPU?
- 24. instale rpy2 en Windows7 64bit para Python 2.7
- 25. ¿Puedo usar 32bit dll o exe en 64bit python?
- 26. donde puedo descargar pymongo en 64bit ubuntu/linux
- 27. Cómo habilitar SSL en IIS 7/Windows 7 64bit
- 28. Delphi 2007 IMAGE_FILE_LARGE_ADDRESS_AWARE
- 29. "Fundamentos de Delphi" en Delphi 2009
- 30. C to assembly call convention 32bit vs 64bit
asm, disponibles en 64 bits Delphi también. – Giel
Supongo que no es tan simple como simplemente escribir 'popcnt eax, eax' o' popcnt rax, rcx' dentro de un bloque de asm, ¿o sí? –
Un poco fuera de tema: http://www.strchr.com/crc32_popcnt tiene una tabla de comparación de implementaciones popcnt, donde una variante SSSE3 ('pshufb' para búsqueda de tablas de nibble) en realidad supera' popcnt' en algunos sistemas. Solo un pequeño%, no necesariamente el mismo en todas las CPU, y solo es beneficioso si realiza la operación para una gran cantidad de datos (más de 100 bytes). _Muy rápido_ es relativo. –