Wie kann man nur bestimmte Bits eines Bytes in C eingestellt, ohne den Rest zu beeinflussen?

StackOverflow https://stackoverflow.com/questions/4439078

  •  09-10-2019
  •  | 
  •  

Frage

sagen, ich habe ein Byte wie dieser 1010XXXX wo die X-Werte könnten alles sein. Ich mag die unteren vier Bits zu einem bestimmten Muster setzen, sagt 1100, während die oberen vier Bits unbeeinflusst bleibt. Wie würde ich dies tun, die schnellste in C?

War es hilfreich?

Lösung

Sie können alle diese Bits auf 0 durch bitweise AND-Verknüpfung zusammen mit den anderen vier Bits auf 0 gesetzt und alle anderen auf 1 gesetzt (Dies ist die Ergänzung der 4 Bits auf 1 gesetzt). Sie können dann bitweise oder in den Bits wie gewohnt.

dh

 val &= ~0xf; // Clear lower 4 bits. Note: ~0xf == 0xfffffff0
 val |= lower4Bits & 0xf; // Worth anding with the 4 bits set to 1 to make sure no
                          // other bits are set.

Andere Tipps

Generell gilt:

value = (value & ~mask) | (newvalue & mask);

mask ist ein Wert, mit allen Bits geändert werden (und nur sie) auf 1 gesetzt - es wäre 0xf in Ihrem Fall. newvalue ist ein Wert, der den neuen Status dieser Bits enthält -. alle anderen Bits im Wesentlichen ignoriert werden

Dies funktioniert für alle Arten, für die Bit-Operatoren werden unterstützt.

Verwenden bitweise Operator oder | wenn Sie das Bit eines Bytes von 0 bis 1 ändern.

Verwenden bitweise Operator und & wenn Sie das Bit eines Bytes ändern 1 bis 0

Beispiel

#include <stdio.h>

int byte;
int chb;

int main() {
// Change bit 2 of byte from 0 to 1
byte = 0b10101010;    
chb = 0b00000100;       //0 to 1 changer byte
printf("%d\n",byte);    // display current status of byte

byte = byte | chb;      // perform 0 to 1 single bit changing operation
printf("%d\n",byte);

// Change bit 2 of byte back from 1 to 0
chb = 0b11111011;       //1 to 0 changer byte

byte = byte & chb;      // perform 1 to 0 single bit changing operation
printf("%d\n",byte);
}

Vielleicht gibt es bessere Möglichkeiten, ich weiß nicht. Dies wird Ihnen jetzt helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top