2010-01-24 17 views
18

fand ich dieses Stück Code:Was macht (1U << X)?

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

Was bedeutet die (1U << X) tun?

Antwort

31

Es setzt Bitmasken:

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

Was geschieht, ist, verschoben 1U (unsigned Wert 1) an der von x Bits nach links.

Der Code, den Sie geschrieben entspricht:

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

Bit-Verschiebung. Anstatt a = 1, b = 2, c = 4 zu sagen, verschieben sie die Bits. Die Idee ist, viele Flags in eine ganze Zahl (oder lang) zu packen.

Dies ist eigentlich ein sehr sauberer Ansatz.

2

< < ist der Bitshift-Operator. Es nimmt die Bits auf der linken Seite und verschiebt sie um einen Betrag, der auf der rechten Seite angegeben ist. Zum Beispiel:

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

usw.

0

1U ist ein Wert ohne Vorzeichen mit dem einzelnen Bit 0 gesetzt, und alle anderen Bits gelöscht. Der Operator << bedeutet "Verschiebung nach links". 1U << 0 bedeutet, einen Wert mit gesetztem Bit 0 zu erstellen; 1U << 1 bedeutet, einen Wert mit gesetztem Bit 1 zu erstellen;

usw.
0

Das

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

Snippet deklariert eine Aufzählung mit Werten, die Potenzen von 2 sind, um vermutlich als Masken auf einem Wert verwendet werden, die mehrere Flags enthält.

So zum Beispiel ein Wert etwas darstellt, das IsDynamic und IsSharable ist

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

Und zu testen, ob der Wert IsStrong

if (value & IsStrong) { ... }