Как вы устанавливаете только определенные бит байта в C, не влияя на остальных?

Скажем, у меня есть такой байт, как этот 1010XXXX, где значения X могут быть чем угодно. Я хочу установить нижние четыре бита на определенный шаблон, например, 1100, оставляя без изменения верхние четыре бита. Как бы я сделал это быстрее всего в C?

3 ответа

Вы можете установить все эти биты в 0 с помощью бит-бит с 4-мя битами, установленными в 0, а все остальные установлены в 1 (это дополнение к 4 битам, установленным в 1). Затем вы можете поразрядно или в битах, как обычно.

т

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.


В общем:

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

mask - это значение со всеми битами, которые нужно изменить (и только они), установленными в 1 - это будет 0xf в вашем случае. newvalue - это значение, которое содержит новое состояние этих битов - все остальные биты по существу игнорируются.

Это будет работать для всех типов, для которых поддерживаются побитовые операторы.


Использовать побитовый оператор или | когда вы хотите изменить бит байта от 0 до 1.

Использовать побитовый оператор и, если вы хотите изменить бит байта от 1 до 0

Пример

#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);
}
</stdio.h>

Может быть, есть лучшие способы, я не знаю. Это поможет вам на данный момент.

licensed under cc by-sa 3.0 with attribution.