2017-12-29 10 views
0

Auf den Punkt. Ich möchte höhere 8 Bits einer Variablen ändern.So löschen und setzen Sie hohe 8 Bit ULONG

ULONG parameters; 

Ich kann sie so bekommen:

(parameters >> 24) & 0xFF 

Aber ich bin nicht wirklich sicher, wie kann ich den Wert dort löschen und meine eigene gesetzt.

+1

Mögliches Duplikat von [Wie setze ich mehrere Bits in einer Zeile in C?] (Https://stackoverflow.com/questions/21786843/how-to-set-multiple-bits-in-one-line-in- c) –

+1

Ihr veröffentlichter Code zeigt an, dass ein "ULONG" 32 Bit lang ist. Das kann oder darf nicht wahr sein. Eine sinnvolle Methode, um die Anzahl der Bits zu erhalten, ist: 'ULONG myvar; unsigned numBits = sizeof (ULONG) * 8' In jedem Fall ist eine Methode, um die oberen Bits zu löschen: then: 'myvar & = (ULONG) (0x00 << (numBits -8);' um diese Bits auf einen bestimmten Wert zu setzen) Wert, lösche sie zuerst, dann: 'myvar | = (ULONG) (theValue) << (numBits -8);' – user3629249

Antwort

1

Wenn Sie diese Bits gelöscht werden soll und setzen Sie sie auf Null:

parameters &= 0x00ffffff; // (mask for bits [0, 24) 

Alternativ lassen Sie uns sagen, Sie haben eine Maske für jene obere 8-Bit:

enum {bitmask = 0xff000000}; // (mask for bits [24, 32) 

Sie können ebenfalls klar jene oberen 8 Bits (Bits [24, 32) oder [24, 31]) mit dem Komplement der Maske:

parameters &= ~bitmask; // (~0xff000000 == 0x00ffffff) 

eine bitweise Ergänzung verwenden, kann hier verschwenderisch erscheinen, wenn Sie es vermeiden können aber in der Regel Optimizern sind mehr als intelligent genug, um sie zu beseitigen, wenn bitmask zur Compile-Zeit bekannt ist. Wenn Sie möchten, Bits im Bereich einzustellen, [24, 32) zu some_value dann:

parameters &= ~bitmask;   // clear bits [24, 32) 
parameters |= (some_value << 24); // shift some_value to occupy 
            // bits [24, 32) and combine the 
            // bits. 

Beachten Sie, dass some_value sollte einen Bereich haben, der in 8-Bit passt. Wir verschieben diese 8 Bits im Wesentlichen nach links, um die Bits [24, 32) zu belegen. Dann kombiniert die bitwise or die Bits, die nach dem Löschen dieser oberen 8 Bits bewirken, dass sie auf diesen Wert gesetzt werden. Dann können Sie den Wert herausziehen wieder mit:

some_value = (parameter >> 24); 

Sie haben nicht wirklich eine bitwise and hier mit 0xff tun müssen, wenn Sie garantieren können, dass parameter ist 32-Bit oder dass irgendwelche Bits über Bit 32 nicht benutzt/gesetzt werden. Ansonsten:

some_value = (parameter >> 24) & 0xff; 

Oder wenn Sie, dass bitmask praktisch:

some_value = (parameter & bitmask) >> 24; 

Oft kann es nützlich sein, zu definieren, sowohl eine Maske und Verschiebungswert, etwa so:

enum 
{ 
    shift = 24, 
    bitmask = 0xff000000, // mask for bits [24, 32) 
}; 

Dann sind Sie kann dies verallgemeinern zu:

// fetching some value: 
some_value = (parameter & bitmask) >> shift; 

// setting some value: 
parameter = (parameter & ~bitmask) | (some_value << shift); 

Und das funktioniert unabhängig davon, wie Sie die Bitmaske und den Verschiebungswert einstellen.Wenn Sie Bits im Bereich festlegen möchten: [8, 24) (16-Bit), dann tun wir einfach:

enum 
{ 
    shift = 8, 
    bitmask = 0x00ffff00, // mask for bits [8, 24) 
}; 

Und der obige Code sollte gut funktionieren.

3

Sie können mit den hohen 8 Bit löschen:

value &= 0x00FFFFFF; 

Beachten Sie, dass die 00 nicht wirklich benötigt, ist es dort nur für Klarheit. Und wenn Sie alle hohen 8 Bits gesetzt werden soll:

value |= 0xFF000000; 
+0

Aber, wie man es zu spezifischem Wert setzt? Weisen Sie ihm einen Wert zu. – lll

Verwandte Themen