Mam wartość Int64, ale ja potrzebuję tylko niższe 32 bity. Dlatego chcę szybki sposób, aby uzyskać wartość Int32 z niższych 32 bitów wartości Int64.Chcę uzyskać niski 32 bit int64 jako int32
Dzięki
Mam wartość Int64, ale ja potrzebuję tylko niższe 32 bity. Dlatego chcę szybki sposób, aby uzyskać wartość Int32 z niższych 32 bitów wartości Int64.Chcę uzyskać niski 32 bit int64 jako int32
Dzięki
zrobić coś takiego:
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);
To może nie być najbardziej zwarty sposób to zrobić, ale wydaje się być najbardziej czytelny dla mnie. Poniższy kod będzie wyodrębnić wysoki połowę długa:
long tempLong = (int)(yourLong >> 32);
W zależności od tego, jak dobrze kompilator optymalizuje, pierwsza próbka kodu może być znacznie wolniejsza niż samo rzutowanie. Osobiście też nie wydaje mi się to szczególnie jasne. –
, aby wyzerować 32-bitowe bity, użyj 'yourLong & 0xFFFFFFFF00000000' lub' yourLong i (~ 0ULL << 32) ', ale aby uzyskać niskie bity, potrzebne jest tylko proste zadanie, ponieważ góra zawsze będzie obcięta, kompilator ostrzega o użyciu rzutki 'yourInt = (int) yourLong' –
nie określono języka, ale w wielu, wszystko co musisz zrobić, to rzucić go do Int32. Najlepsze bity zostaną odrzucone.
Jeśli przypisać wartość Int64 na wartość int32, kompilator automatycznie zrobić dla ciebie
(jak Steven Sudit wymienionych):
int64 val64 = ...;
int32 val32 = ...;
...
val32 = val64; // get the low 32 bits
// or
val32 = (val64 >> 32); // get the high 32 bits
a ponieważ kompilator może wyświetlać ostrzeżenia można określić obsadę
val32 = (int32)val64;
Mogłabyś niech kompilator obsłużyć endian-ness i ukryć wszelkie przesunięcia bitowego wskaźnika manipulacji, itp
DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){
ULARGE_INTEGER uli;
uli.QuadPart = in64;
return uli.LowPart;
}
w C/C++ najlepszy sposób (moim zdaniem) jest użycie związku. Na przykład poniższa funkcja używa anonimowego związku, aby wyodrębnić 32-bitowe 32-bitowe sekwencje z 64-bitowej liczby całkowitej.
uint32_t lower_32_bits(uint64_t value) {
union { uint64_t value; struct { uint32_t high, low; }; } converter;
converter.value = value;
return converter.low;
}
Związek ten trik może być stosowany do wszelkiego rodzaju rzeczy, jak się bity wartości zmiennoprzecinkowej na liczbę całkowitą o tej samej bitlength, np za wykonywanie operacji bitowych i innych hacków.
który to jest język? proszę dodać poprawny tag –
Nie rozumiem, jak ktoś może odpowiedzieć na to pytanie bez znajomości języka. – pseudocoder