Angenommen, ich habe ein Byte wie dieses 1010XXXX, wo die X-Werte alles sein könnten. Ich möchte die unteren vier Bits auf ein bestimmtes Muster einstellen, sagen wir 1100, während die oberen vier Bits unberührt bleiben. Wie würde ich das am schnellsten in C machen?Wie stellen Sie nur bestimmte Bits eines Bytes in C ein, ohne den Rest zu beeinflussen?
Antwort
Sie können alle diese Bits auf 0 setzen, indem Sie bitweise die 4 Bits auf 0 und alle anderen auf 1 setzen (Dies ist das Komplement der 4 Bits, die auf 1 gesetzt sind). Sie können dann bitweise oder in den Bits wie gewohnt arbeiten.
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.
Allgemein gilt:
value = (value & ~mask) | (newvalue & mask);
mask
ist ein Wert, mit allen Bits geändert werden (und nur sie) auf 1 gesetzt - es ist in Ihrem Fall 0xf würde. newvalue
ist ein Wert, der den neuen Status dieser Bits enthält - alle anderen Bits werden im Wesentlichen ignoriert.
Dies funktioniert für alle Typen, für die bitweise Operatoren unterstützt werden.
Verwenden Sie den bitweisen Operator oder | wenn Sie das Bit eines Bytes von 0 bis 1
Verwenden bitweise Operator und & ändern, wenn Sie das Bit eines Bytes von 1 auf 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);
}
ändern möchten Vielleicht gibt es bessere Wege, ich weiß es nicht. Dies wird Ihnen jetzt helfen.
Können Sie bitte ein konkretes Beispiel geben? Angenommen, ich habe: n = 1024. Ich möchte Bits von Position 3 zu 7 (einschließlich, beginnend von 0 mit dem niedrigstwertigen Bit) zu k = 19 ändern. Das Ergebnis sollte sein: 1176. Wie kann ich es erreichen? Vielen Dank. – dh16