Necesito combinar dos valores de 32 bits para crear un valor de 64 bits. Estoy buscando algo análogo a MAKEWORD
y MAKELONG
. Puedo definir fácilmente mi propia macro o función, pero si la API ya proporciona una, preferiría usar eso.¿Hay una función MAKELONGLONG?
Respuesta
No puedo encontrar ninguno en la API de Windows. Sin embargo, sé que usted trabaja en su mayoría (o, al menos, mucho) con Delphi, asi que aquí hay una función rápida Delphi:
function MAKELONGLONG(A, B: cardinal): UInt64; inline;
begin
PCardinal(@result)^ := A;
PCardinal(cardinal(@result) + sizeof(cardinal))^ := B;
end;
Aún más rápido:
function MAKELONGLONG(A, B: cardinal): UInt64;
asm
end;
Explicación: En el normal register
convención de llamadas, los primeros dos argumentos (si tamaño cardinal) se almacenan en EAX y EDX, respetivamente. Un resultado (de tamaño cardinal) se almacena en EAX. Ahora, un resultado de 64 bits se almacena en EAX (bits menos significativos, dirección baja) y EDX (bits más significativos, dirección alta); por lo tanto, tenemos que mover A
a EAX y B
a EDX, ¡pero ya están allí!
Gracias por considerar mis antecedentes, pero resulta que ahora estoy trabajando en C y C++. Tu truco de astm es inteligente. Yo nombraría las variables 'H' y' L' para que Code Completion me recordara en qué orden van. Mi implementación Delphi habría sido comparable a una implementación C: 'Result: = (UInt64 (H) shl 32) o L'. –
Tenía la esperanza de obtener una respuesta un poco más definitiva que "No veo ninguna", pero probablemente me puse demasiado alta, por lo que esta respuesta recibe el premio. Gracias. –
personalmente prefiero C-macros
#define MAKE_i64(hi, lo) ( (LONGLONG(DWORD(hi) & 0xffffffff) << 32) | LONGLONG(DWORD(lo) & 0xffffffff) )
Prefiero funciones, pero esta no era una cuestión de preferencias personales. Era una cuestión de existencia en la API. ¿Tu respuesta es * no *? Además, las máscaras de bits no aportan nada en tu macro. –
- 1. Hay una diferencia entre (función() {...}()); y (función() {...})() ;?
- 2. ¿Hay una función hash circular?
- 3. ¿Hay una función bidireccional en Guava?
- 4. ¿Hay una función lambda en Scala?
- 5. ¿Hay una función sleep() para Android NDK?
- 6. ¿no hay una "función" normal en java?
- 7. Java: ¿hay una función de mapa?
- 8. ¿Hay una función de raíz en rubí?
- 9. ¿Hay una función eval() en Java?
- 10. ¿Hay una función como isdate() para datetime2?
- 11. ¿Hay una función `printk()` que admita `va_list`?
- 12. ¿Hay una función haskell para las fechas?
- 13. ¿Hay una función numpy max min?
- 14. ¿Hay una función como _compile_select o get_compiled_select()?
- 15. ¿Hay una función de identidad scala?
- 16. ¿Hay una función de "mapa" en php?
- 17. ¿Hay una función dividida en xpath?
- 18. ¿Hay una función en java para obtener una media móvil?
- 19. ¿Hay una función de Javascript que reduzca una fracción de
- 20. ¿Hay una función R que aplica una función a cada par de columnas?
- 21. En Lua, ¿hay alguna función que, dada una función, devuelva su nombre como una cadena?
- 22. ¿Hay una función de error complementario escalada en python disponible?
- 23. ¿Hay una buena función de "encontrar todo" en Eclipse?
- 24. ¿Cuánta sobrecarga hay para llamar a una función en C++?
- 25. ¿Hay una biblioteca C# que realice la función Excel NORMINV?
- 26. ¿Hay una función hash "suficientemente buena" para el programador promedio?
- 27. ¿Hay una función de resaltado vertical en NetBeans?
- 28. ¿Hay alguna manera de "eliminar" una función virtual pura?
- 29. ¿Hay una función cmake para actualizar los archivos .pot?
- 30. ¿De qué maneras hay para editar una función en R?
Por "Combinar" Qué quiere decir "añadir" o "multiplicar"? – mcandre
@mcandre: Quiere decir en el sentido de MAKEWORD. –
Andreas tiene razón, @Mcandre. Como dije, "análoga a MAKEWORD y MAKELONG". –