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?
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?
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
}
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.
< < 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.
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;
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) { ... }