2009-09-19 9 views
8

Ho un valore Int64, ma ho solo bisogno dei 32 bit inferiori. Quindi voglio un modo rapido per ottenere il valore Int32 dai 32 bit inferiori del valore Int64.Voglio ottenere il 32 bit basso di un int64 come int32

Grazie

+4

quale lingua è questa? per favore aggiungi il tag corretto –

+1

Non capisco come qualcuno possa rispondere a questa domanda senza conoscere la lingua. – pseudocoder

risposta

5

fare qualcosa di simile:

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

Questo non può essere il modo più compatto per farlo, ma sembra essere il più leggibile per me. Il seguente codice estrarrà la metà alta della lunga:

long tempLong = (int)(yourLong >> 32); 
+7

A seconda dell'ottimizzazione del compilatore, il tuo primo esempio di codice potrebbe essere notevolmente più lento del semplice casting. Personalmente, non lo trovo particolarmente chiaro. –

+1

per azzerare i 32 bit bassi, usare 'yourLong & 0xFFFFFF00000000' o' yourLong & (~ 0ULL << 32) ', ma per ottenere i bit bassi, è necessario solo un semplice compito perché la parte superiore sarà sempre troncata, il compilatore avverte l'uso di un cast 'yourInt = (int) yourLong' –

9

non è stata specificata la lingua, ma in molti, tutto quello che dovete fare è lanciare a un Int32. I primi bit saranno scartati.

24

Se si assegna un valore Int64 in un valore Int32, il compilatore automaticamente farà per voi
(come Steven Sudit menzionato):

int64 val64 = ...; 
int32 val32 = ...; 
... 

val32 = val64; // get the low 32 bits 
// or 
val32 = (val64 >> 32); // get the high 32 bits 

e perché il compilatore potrebbe visualizzare avvisi è possibile specificare il cast

val32 = (int32)val64; 
1

si potrebbe lasciare che il compilatore gestire l'endian-ness, e nascondere tutto lo spostamento bit, la manipolazione dei puntatori ecc

DWORD CUtility::ConvertUint64toUint32(unsigned __int64 in64){ 
    ULARGE_INTEGER uli; 
    uli.QuadPart = in64; 
    return uli.LowPart; 
} 
+0

Aggiungi 4 spazi davanti al tuo codice in modo che sia formattato correttamente. – DanM7

+0

Oppure seleziona il blocco del tuo codice e premi Ctrl-K. – SiKing

+0

Intendevi "ConvertUint64toUint32"? – Quest

-1

In C/C++ il modo migliore (a mio parere) è quello di utilizzare un sindacato. Ad esempio, la seguente funzione utilizza un'unione anonima per estrarre i 32 bit di ordine inferiore da un numero intero a 64 bit.

uint32_t lower_32_bits(uint64_t value) { 
    union { uint64_t value; struct { uint32_t high, low; }; } converter; 
    converter.value = value; 
    return converter.low; 
} 

Questa unione trucco può essere utilizzato per tutti i tipi di cose, come ottenere i bit di un valore in virgola mobile in un intero dello stesso bitlength, ad esempio per eseguire operazioni bit a bit e altri hack.

Problemi correlati