2009-06-17 10 views
1

Ceci est pour MSVCque fait cette macro C++?

#define Get64B(hi, lo) ((((__int64)(hi)) << 32) | (unsigned int)(lo)) 

Plus précisément, quel est le rôle du 'opérateur < <'?

Merci pour votre aide

+0

Merci les gars. La façon dont cela a été utilisé dans le code est de créer un identifiant unique à partir de deux nombres, comme la plupart des gens l'ont dit, deux nombres de 32 bits. – fadini

Répondre

17

< < est l'opérateur de décalage vers la gauche. Cette macro est destinée à produire une valeur de 64 bits à partir de deux valeurs de 32 bits, en utilisant le premier argument comme les 32 premiers bits et le second comme les 32 derniers bits de la nouvelle valeur.

3

Il faut deux nombres entiers 32 bits et renvoie un nombre entier de 64 bits, le premier paramètre comme les 32 bits de poids fort et le second que les 32 bits de poids faible.

< < est l'opérateur de décalage vers la gauche. Il prend les 32 bits hauts, les déplace sur, et puis OR le résultat avec les bits faibles.

2
opérateur

< < est un opérateur de décalage à gauche binaire. Il décale la variable int64 à gauche de 32 bits.

0

Ce bit décale la valeur de salut vers la gauche de 32 bits.

0

Ceci est l'opérateur de décalage vers la gauche, et sa signification standard (pour les types de numéro) se déplace bits vers la gauche

int a = 1; 
int b = a << 3; // b is now 1000 binary, 8 decimal 

Le code crée un certain nombre de 64 bits à partir de deux 32 nombres de bits.

2

AakashM est correct. Il peut être plus facile à comprendre écrit comme méthode

__int64 Get64B(__int32 hi, __int32 lo) { 
    __int64 combined = hi; 
    combined = combined << 32; // Shift the value 32 bits left. Combined 
           // now holds all of hi on the left 32 bits 
    combined = combined | lo; // Low 32 bits now equal to lo 
    return combined; 
} 
0

qui retourne un int 64 bits en utilisant deux 32 bits int, on est utilisé comme de salut octets de commande et le second les octets d'ordre bas.

hi < < 32 convertit l'entier en octets de poids fort de l'int de 64 bits. Exemple:

Get64B (11111111111111110000000000000000, 000000000000000011111111111111111)

rendements 11111111111111110000000000000000000000000000000011111111111111111

Because 11111111111111110000000000000000 < < 32 renvoie

-1

retour Un entier de 64 bits de deux 8,16,32 ou des entiers de 64 bits. Plus sûr: salut < < 32 | lo

+0

Le décalage de 32 bits sans le transtyper dans un int 64 bits entraînera un débordement. –

+0

C'est exactement ce que je suis en train d'expliquer. Vous devez d'abord lancer le salut à 64bits. Ceci est fait par (__int64) salut. Il n'est pas prudent d'écrire: h << 32 | lo. La macro peut être simplifiée en: "(__int64) hi << 32 | lo", quand hi et lo sont "unsigned char", "unsigned short" ou "unsigned". – bill