2010-01-24 6 views
18

J'ai trouvé ce morceau de code:Que fait (1U << X) faire?

enum 
{ 
    IsDynamic = (1U << 0), // ... 
    IsSharable = (1U << 1), // ... 
    IsStrong = (1U << 2) // ... 
}; 

Qu'est-ce que le (1U << X) faire?

Répondre

31

Il définit bitmasks:

1U << 0 = 1 
1U << 1 = 2 
1U << 2 = 4 
etc... 

Ce qui se passe est 1U (valeur non signé 1) est décalée vers la gauche de x bits.

Le code affiché est équivalent à:

enum 
{ 
     IsDynamic = 1U, // binary: 00000000000000000000000000000001 
     IsSharable = 2U, // binary: 00000000000000000000000000000010 
     IsStrong = 4U // binary: 00000000000000000000000000000100 
} 
2

Bit changement. Au lieu de dire a = 1, b = 2, c = 4 ils décalent les bits. L'idée est d'emballer de nombreux drapeaux en un entier (ou long).

C'est en fait une approche très propre.

2

< < est l'opérateur bitshift. Il prendra les bits du côté gauche et les décalera d'une quantité spécifiée par le côté droit. Par exemple:

1 << 1 -> 0b0001 << 1  => 0b0010 
1 << 2 -> 0b0001 << 2  => 0b0100 

etc.

0

1U est une valeur non signée avec le seul bit 0 jeu, et tous les autres bits effacés. L'opérateur << signifie "Maj vers la gauche". 1U << 0 signifie créer une valeur avec le bit 0 set; 1U << 1 signifie créer une valeur avec le bit 1 défini; etc.

0

Cet extrait de code

enum 
{ 
     IsDynamic = (1U << 0), // ... 
     IsSharable = (1U << 1), // ... 
     IsStrong = (1U << 2) // ... 
} 

déclare une énumération des valeurs qui sont des puissances de 2. Pour utiliser vraisemblablement sous forme de masques sur une valeur qui contient plusieurs drapeaux.

Ainsi, par exemple une valeur représentant quelque chose qui isDynamic et IsSharable est

unsigned value = IsDynamic | IsSharable; // could use + as well 

Et pour tester si la valeur IsStrong

if (value & IsStrong) { ... }