Комментарии (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-разработчика, особенно в системном программировании, сетевых протоколах и оптимизации производительности.