Работа с битами и битовыми масками в C

НАВИГАЦИЯ ПО СТРАНИЦЕ

Установка бита Сброс бита Переключение бита Получение значения бита Маскирование битов Сдвиг битов

Работа с битами и битовыми масками в языке C позволяет выполнять различные операции с индивидуальными битами данных, а также управлять их состоянием. Вот несколько примеров, как это можно сделать:

Установка бита (установка в 1):

unsigned int setBit(unsigned int n, int pos) {
    return n | (1 << pos);
}

Пример:

int number = 5;  // Бинарное представление: 00000101
number = setBit(number, 3); // Устанавливаем четвёртый бит (считая с нуля)
// Теперь number равно 13, бинарное представление: 00001101

Сброс бита (установка в 0):

unsigned int clearBit(unsigned int n, int pos) {
    return n & ~(1 << pos);
}

Пример:

int number = 13; // Бинарное представление: 00001101
number = clearBit(number, 2); // Сбрасываем третий бит
// Теперь number равно 9, бинарное представление: 00001001

Переключение бита (из 0 в 1 и наоборот):

unsigned int toggleBit(unsigned int n, int pos) {
    return n ^ (1 << pos);
}

Пример:

int number = 9;  // Бинарное представление: 00001001
number = toggleBit(number, 0); // Переключаем нулевой бит
// Теперь number равно 8, бинарное представление: 00001000

Получение значения бита:

int getBit(unsigned int n, int pos) {
    return (n >> pos) & 1;
}

Пример:

int number = 13; // Бинарное представление: 00001101
int bit = getBit(number, 2); // Получаем значение третьего бита
// Значение bit теперь равно 1, так как третий бит установлен в 1

Маскирование битов:

Использование битовых масок позволяет извлекать или устанавливать группы битов. Например, чтобы извлечь первые 4 бита из числа:

int mask = 0xF; // Бинарное представление: 00001111
int result = number & mask;

Сдвиг битов:

Сдвиг битов влево и вправо позволяет изменять значения чисел, умножая или деля на 2. Например, сдвиг влево на 1 эквивалентен умножению на 2, а сдвиг вправо на 1 - делению на 2.

int number = 8;  // Бинарное представление: 00001000
number = number << 1; // Сдвигаем биты влево на 1
// Теперь number равно 16, бинарное представление: 00010000

Это лишь несколько примеров работы с битами и битовыми масками в языке C. Эти операции часто используются при работе с железом (например, управление портами ввода-вывода), а также при решении задач, связанных с битовыми флагами и масками.