2009-09-19 3 views
8

J'ai une valeur Int64, mais j'ai seulement besoin des 32 bits inférieurs. Ainsi, je veux un moyen rapide d'obtenir la valeur Int32 des 32 bits inférieurs de la valeur Int64.Je veux obtenir le bit 32 bas d'un int64 comme int32

Merci

+4

quelle langue est-ce? s'il vous plaît ajouter la balise correcte –

+1

Je ne comprends pas comment quelqu'un peut répondre à cette question sans connaître la langue. – pseudocoder

Répondre

5

quelque chose comme ça:

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

Cela peut ne pas être le moyen le plus compact de le faire, mais il semble être le plus lisible pour moi. Le code suivant extrait la moitié haute de la longue:

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

En fonction de l'optimisation du compilateur, votre premier échantillon de code peut être sensiblement plus lent que le simple cast. Personnellement, je ne le trouve pas particulièrement clair non plus. –

+1

pour mettre à zéro les 32 bits bas, utilisez 'yourLong & 0xFFFFFFFF00000000' ou' yourLong & (~ 0ULL << 32) ', mais pour obtenir les bits faibles, seule une affectation simple est nécessaire car le sommet sera toujours tronqué, il le compilateur avertit l'utilisation d'un cast 'yourInt = (int) yourLong' –

9

Vous ne précisaient pas le langage, mais dans beaucoup, tout ce que vous devez faire est de jeter un Int32. Les bits supérieurs seront supprimés.

24

Si vous attribuez une valeur int64 en une valeur int32, le compilateur fera automatiquement pour vous
(comme Steven Sudit mentionné):

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

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

et parce que le compilateur peut afficher des avertissements que vous pouvez spécifier la distribution

val32 = (int32)val64; 
1

vous pourriez laissez le compilateur gérer la endian-ness, et cacher tout le décalage de bits, la manipulation de pointeur etc.

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

Ajouter 4 espaces devant votre code afin qu'il soit correctement formaté. – DanM7

+0

Ou, sélectionnez le bloc de votre code et appuyez sur Ctrl-K. – SiKing

+0

Voulez-vous dire "ConvertUint64toUint32"? – Quest

-1

en C/C++ la meilleure façon (à mon avis) est d'utiliser un syndicat. Par exemple, la fonction suivante utilise une union anonyme pour extraire les 32 bits d'ordre inférieur d'un entier 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; 
} 

Cette astuce syndicale peut être utilisé pour toutes sortes de choses, comme obtenir les bits d'une valeur en virgule flottante en un nombre entier de la même longueur en bits, par exemple pour faire des opérations au niveau du bit et d'autres hacks.

Questions connexes