Как вы устанавливаете только определенные биты байта в C, не влияя на остальные? - PullRequest
16 голосов
/ 14 декабря 2010

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

Ответы [ 3 ]

44 голосов
/ 14 декабря 2010

В общем случае:

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

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

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

13 голосов
/ 14 декабря 2010

Вы можете установить все эти биты в 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.
0 голосов
/ 26 июля 2017

Использовать побитовый оператор или |когда вы хотите изменить бит байта с 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);
}

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

...