Практические приёмы работы с битами
Распространённые методы
«Практические приёмы работы с битами» — бесплатный урок C Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.
Полезные приёмы работы с битами
Когда Вы понимаете побитовые операторы, Вам становится доступен набор компактных приёмов. Они работают быстро и часто встречаются в настоящем коде.
Рассмотрим самые распространённые из них.
#include <stdio.h>
int main(void) {
unsigned x = 6;
printf("x & 1 = %u (odd if 1)\n", x & 1);
return 0;
}Чётность числа
Младший бит показывает чётность. x & 1 равен 1 для нечётных чисел и 0 для чётных.
#include <stdio.h>
int main(void) {
for (unsigned x = 0; x < 5; x++) {
printf("%u is %s\n", x, (x & 1) ? "odd" : "even");
}
return 0;
}Проверка степени двойки
Положительное число является степенью двойки, если установлен ровно один бит. Выражение x & (x - 1) равно 0 только в этом случае.
#include <stdio.h>
int is_pow2(unsigned x) {
return x != 0 && (x & (x - 1)) == 0;
}
int main(void) {
printf("%d %d %d\n", is_pow2(16), is_pow2(18), is_pow2(1));
return 0;
}Сброс младшего установленного бита
x & (x - 1) сбрасывает младший установленный бит. На этом основан быстрый подсчёт установленных битов.
#include <stdio.h>
int main(void) {
unsigned x = 0b10110;
printf("before: %u\n", x);
printf("after: %u\n", x & (x - 1));
return 0;
}Выделение младшего установленного бита
x & (-x) выделяет младший установленный бит, оставляя включённым только его.
Этот приём основан на представлении чисел в дополнительном коде.
#include <stdio.h>
int main(void) {
unsigned x = 0b10110;
printf("lowest set bit = %u\n", x & (-x));
return 0;
}Подсчёт установленных битов
Последовательный сброс младшего установленного бита позволяет подсчитать количество установленных битов за столько шагов, сколько установлено битов.
#include <stdio.h>
int popcount(unsigned x) {
int n = 0;
while (x) { x &= (x - 1); n++; }
return n;
}
int main(void) {
printf("%d\n", popcount(255));
printf("%d\n", popcount(0b1010));
return 0;
}Обмен без временной переменной
Обмен XOR позволяет поменять местами два целых числа без дополнительного хранилища.
#include <stdio.h>
int main(void) {
int a = 3, b = 8;
a ^= b; b ^= a; a ^= b;
printf("a=%d b=%d\n", a, b);
return 0;
}Округление вверх до степени двойки
Можно округлить беззнаковое значение вверх до следующей степени двойки: распространить старший бит вниз, а затем прибавить 1.
#include <stdio.h>
unsigned next_pow2(unsigned v) {
v--;
v |= v >> 1; v |= v >> 2; v |= v >> 4;
v |= v >> 8; v |= v >> 16;
return v + 1;
}
int main(void) {
printf("%u\n", next_pow2(17));
printf("%u\n", next_pow2(100));
return 0;
}Проверка различий между битами
Два значения различаются ровно в тех битах, которые установлены в a ^ b. Их подсчёт даёт расстояние Хэмминга.
#include <stdio.h>
int main(void) {
unsigned a = 0b1101, b = 0b1011;
unsigned diff = a ^ b;
int count = 0;
while (diff) { diff &= diff - 1; count++; }
printf("hamming distance = %d\n", count);
return 0;
}Модуль без ветвления
Используя знаковый бит, можно вычислить модуль числа без if. Для отрицательных чисел маска состоит из одних единиц, а для неотрицательных — из одних нулей.
#include <stdio.h>
int main(void) {
int x = -42;
int mask = x >> 31;
int abs = (x + mask) ^ mask;
printf("abs = %d\n", abs);
return 0;
}Установка бита по индексу
Сочетайте сдвиг и OR, чтобы установить произвольную позицию бита, вычисленную во время выполнения.
#include <stdio.h>
int main(void) {
unsigned v = 0;
int positions[] = {1, 3, 5};
for (int i = 0; i < 3; i++) {
v |= (1u << positions[i]);
}
printf("v = %u\n", v);
return 0;
}Быстрая проверка
Проверьте свои знания о приёмах работы с битами.
Повторение
Вы изучили практические приёмы работы с битами:
x & 1проверяет чётность.x & (x - 1)сбрасывает младший установленный бит и определяет степени двойки.x & (-x)выделяет младший установленный бит.- Подсчёт установленных битов, обмен XOR, расстояние Хэмминга и вычисление модуля без ветвления.
Часто задаваемые вопросы
Урок «Практические приёмы работы с битами» бесплатный?
Да — полный текст урока «Практические приёмы работы с битами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.
Чему я научусь в уроке «Практические приёмы работы с битами»?
Распространённые методы Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C Academy?
Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Практические приёмы работы с битами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C Academy?
Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Побитовые операторы
- Сдвиги
- Битовые маски и флаги
- Практические приёмы работы с битами