0Pricing
C Academy · Урок

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

Распространённые методы

«Практические приёмы работы с битами» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Побитовые операторы
  2. Сдвиги
  3. Битовые маски и флаги
  4. Практические приёмы работы с битами
← Назад к C Academy