2009-09-19 9 views
8

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

+4

który to jest język? proszę dodać poprawny tag –

+1

Nie rozumiem, jak ktoś może odpowiedzieć na to pytanie bez znajomości języka. – pseudocoder

Odpowiedz

5

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); 
+7

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. –

+1

, 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' –

9

nie określono języka, ale w wielu, wszystko co musisz zrobić, to rzucić go do Int32. Najlepsze bity zostaną odrzucone.

24

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; 
1

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; 
} 
+0

Dodaj 4 spacje przed kodem, aby był poprawnie sformatowany. – DanM7

+0

Lub wybierz blok kodu i naciśnij Ctrl-K. – SiKing

+0

Czy chodziło Ci o "ConvertUint64toUint32"? – Quest

-1

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.

Powiązane problemy