Tengo un valor de Int64, pero solo necesito los 32 bits más bajos. Por lo tanto, quiero una manera rápida de obtener el valor Int32 de los 32 bits más bajos del valor Int64.Quiero obtener los 32 bits de un int64 bajo como int32
Gracias
Tengo un valor de Int64, pero solo necesito los 32 bits más bajos. Por lo tanto, quiero una manera rápida de obtener el valor Int32 de los 32 bits más bajos del valor Int64.Quiero obtener los 32 bits de un int64 bajo como int32
Gracias
hacer algo como esto:
long tempLong = ((yourLong >> 32) << 32); //shift it right then left 32 bits, which zeroes the lower half of the long
int yourInt = (int)(yourLong - tempLong);
Ésta no puede ser la forma más compacta para hacerlo, pero parece ser la más legible para mí. El siguiente código va a extraer la mitad alta de la larga:
long tempLong = (int)(yourLong >> 32);
Dependiendo de qué tan bueno sea el compilador para optimizar, su primera muestra de código puede ser sustancialmente más lenta que solo el casting. Personalmente, tampoco me parece particularmente claro. –
para poner a cero los 32 bits bajos, use 'yourLong & 0xFFFFFFFF00000000' o' yourLong & (~ 0ULL << 32) ', pero para obtener los bits bajos, solo se necesita una asignación simple porque la parte superior siempre estará truncada, el compilador advierte el uso de un molde 'yourInt = (int) yourLong' –
no se ha especificado el idioma, pero en muchos, todo lo que tiene que hacer es echarlo a un Int32. Los bits superiores serán descartados.
Si se asigna un valor Int64 en un valor int32, el compilador hará automáticamente por usted
(como Steven Sudit mencionado):
int64 val64 = ...;
int32 val32 = ...;
...
val32 = val64; // get the low 32 bits
// or
val32 = (val64 >> 32); // get the high 32 bits
y porque el compilador puede mostrar advertencias puede especificar el elenco
val32 = (int32)val64;
usted podría dejar que el compilador de manejar la endian-dad, y ocultar todo el desplazamiento de bits, etc. manipulación de punteros
DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
ULARGE_INTEGER uli;
uli.QuadPart = in64;
return uli.LowPart;
}
En C/C++ de la mejor manera (en mi opinión) es el uso de un sindicato. Por ejemplo, la siguiente función utiliza una unión anónima para extraer los 32 bits de orden inferior de un entero de 64 bits.
uint32_t lower_32_bits(uint64_t value) {
union { uint64_t value; struct { uint32_t high, low; }; } converter;
converter.value = value;
return converter.low;
}
Este truco unión puede ser utilizado para todo tipo de cosas, como conseguir los bits de un valor de punto flotante en un entero de la misma bitlength, por ejemplo, para realizar operaciones a nivel de bit y otros hacks.
¿qué idioma es este? por favor agregue la etiqueta correcta –
No entiendo cómo alguien puede responder esta pregunta sin conocer el idioma. – pseudocoder