← Назад к вопросам

Что такое битовые операции?

1.6 Junior🔥 171 комментариев
#Язык C++

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Битовые операции в C/C++

Битовые операции — это операции прямо над двоичным представлением целых чисел. Работают на уровне отдельных битов и используются для оптимизации, работы с флагами, масок и быстрых вычислений.

Основные битовые операции

1. AND (И) — &

int a = 0b1100;  // 12
int b = 0b1010;  // 10
int c = a & b;   // 0b1000 = 8
// Бит в результате 1, только если оба бита = 1

2. OR (ИЛИ) — |

int a = 0b1100;  // 12
int b = 0b1010;  // 10
int c = a | b;   // 0b1110 = 14
// Бит в результате 1, если хотя бы один бит = 1

3. XOR (Исключающее ИЛИ) — ^

int a = 0b1100;  // 12
int b = 0b1010;  // 10
int c = a ^ b;   // 0b0110 = 6
// Бит в результате 1, если биты различаются

4. NOT (НЕ) — ~

int a = 0b1100;    // 12
int c = ~a;        // ~0b1100 = 0b0011 (для 8-bit) = 3
// Инвертирует все биты

5. Сдвиг влево — <<

int a = 0b0101;   // 5
int c = a << 2;   // 0b010100 = 20 (умножение на 2^2 = 4)
// Сдвигает все биты влево, справа добавляются нули
// Эквивалентно умножению на 2^n

6. Сдвиг вправо — >>

int a = 0b1100;   // 12
int c = a >> 2;   // 0b0011 = 3 (деление на 2^2 = 4)
// Сдвигает все биты вправо
// Для unsigned — справа добавляются нули
// Для signed — depends on implementation (обычно знаковое расширение)

Практические примеры

Проверка, установлен ли бит:

bool is_bit_set(int num, int pos) {
    return (num & (1 << pos)) != 0;
}

int num = 0b1010;
bool result = is_bit_set(num, 1);  // true, бит на позиции 1 установлен

Установка бита:

int set_bit(int num, int pos) {
    return num | (1 << pos);
}

int num = 0b1000;
num = set_bit(num, 0);  // 0b1001 = 9

Очистка бита:

int clear_bit(int num, int pos) {
    return num & ~(1 << pos);
}

int num = 0b1010;
num = clear_bit(num, 1);  // 0b1000 = 8

Переключение бита (toggle):

int toggle_bit(int num, int pos) {
    return num ^ (1 << pos);
}

int num = 0b1010;
num = toggle_bit(num, 0);  // 0b1011 = 11

Проверка, является ли число степенью 2:

bool is_power_of_two(int num) {
    return num > 0 && (num & (num - 1)) == 0;
}

is_power_of_two(8);   // true (0b1000)
is_power_of_two(12);  // false (0b1100)

Подсчёт установленных битов (popcount):

int count_set_bits(int num) {
    int count = 0;
    while (num) {
        count += num & 1;
        num >>= 1;
    }
    return count;
}
// Или современный способ:
int bits = __builtin_popcount(num);

Применение в real-world

  • Флаги и permissions: хранение множества булевых значений в одном int
  • Быстрые операции: умножение/деление на степени 2 вместо / и *
  • Маски для работы с сетевыми протоколами (IP адреса, маски подсетей)
  • Компрессия данных и работа с битовыми полями
  • Оптимизация памяти: битовые поля в структурах
  • Алгоритмы: динамическое программирование с bitmask, поиск подмножеств

Пример с флагами

enum Permissions {
    READ   = 1 << 0,   // 0b001 = 1
    WRITE  = 1 << 1,   // 0b010 = 2
    EXEC   = 1 << 2    // 0b100 = 4
};

int user_perms = READ | EXEC;  // Чтение и выполнение

if (user_perms & WRITE) {
    // Нет прав на запись
}

user_perms |= WRITE;  // Добавить право на запись

Битовые операции — критически важны для backend-разработчика, особенно в системном программировании, сетевых протоколах и оптимизации производительности.

Что такое битовые операции? | PrepBro