БлогNot. Си: как изменить отдельный бит в байте

Си: как изменить отдельный бит в байте

Вопрос:

Добрый вечер, подскажите как изменить бит в байте?

Мой ответ:

Побитовым исключающим или (операция ^) со степенью двойки от номера нужного бита (справа налево, младший бит имеет номер 0)
Пример на консольном Си:

#include <stdio.h>
#include <math.h>

void main () {
 char b=0xFF; //Байт
 int n=3; //Номер бита, который нужно изменить - считаем справа налево с 0
 printf ("\nБыло: %02X",b);
 b^=(int)pow(2,n); //Переключение нужного бита - 0 в 1 или 1 в 0
 printf ("\nПосле переключения: %02X",b);
 b^=(int)pow(2,n);
 printf ("\nПереключили еще раз: %02X",b);
}

На самом деле вычислять степени двойки глупо, раз есть побитовый сдвиг, так что окончательно получаем такую версию:

#include <stdio.h>

void main () {
 char b=0xFF; //Байт
 int n=3; //Номер бита, который нужно изменить - считаем справа налево с 0
 printf ("\nБыло: %02X",b);
 b^=1<<n; //Переключение нужного бита - 0 в 1 или 1 в 0
 printf ("\nПосле переключения: %02X",b);
 b^=1<<n;
 printf ("\nПереключили еще раз: %02X",b);
}

Если нужно просто проверить, установлен ли в байте тот или иной бит, в тех же обозначениях получится следующий код:

if (b&1<<n) {
 //Бит с номером n установлен
}
else {
 //Бит не установлен
}

Здесь нам помогла операция побитового "и" (бинарная операция &)

Наконец, бывает нужно принудительно включить или выключить некоторый бит независимо от его начального состояния. Для принудительного включения пригодится операция побитового "или" (|), ведь обычное "или" с единицей всегда даёт единицу, а с нулём оставляет состояние бита неизменным:

b|=1<<n; //Принудительно включаем бит номер n

Для принудительного выключения бита применим к байту побитовое "и" с числом, обратным к нужной степени двойки, то есть, таким, где все единичные биты заменены нулевыми и наоборот. Взять такое число можно побитовым отрицанием (операция ~), в итоге получится вот что:

b&=~(1<<n); //Принудительно выключаем бит номер n

Побитовое "и" с единицей оставит неизменными все биты кроме того, который сброшен нами в ноль.

Чтобы менять биты не "вручную", используйте <bitset>.

26.04.2012, 14:53 [36828 просмотров]


теги: программирование числа c++

показать комментарии (1)