0Pricing
C Academy · Урок

Битовые маски и флаги

Устанавливайте, очищайте и переключайте биты

«Битовые маски и флаги» — бесплатный урок C Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C Academy содержит 4 уроков всего.

Биты как флаги

Одно целое число может хранить множество параметров «включено/выключено» — по одному на каждый бит. Каждый бит является флагом.

Это компактный и быстрый способ, часто используемый в операционных системах и коде для встроенных систем.

#include <stdio.h>

int main(void) {
    unsigned flags = 0;
    printf("Initial flags = %u\n", flags);
    return 0;
}

Определение масок

Маска — это значение с установленными определёнными битами. Определяйте каждый флаг как степень двойки, чтобы он занимал собственный бит.

#include <stdio.h>

#define READ  (1u << 0)
#define WRITE (1u << 1)
#define EXEC  (1u << 2)

int main(void) {
    printf("READ=%u WRITE=%u EXEC=%u\n", READ, WRITE, EXEC);
    return 0;
}

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

Чтобы включить флаг, выполните операцию OR значения с маской: flags |= MASK.

Уже установленные биты останутся установленными.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = 0;
    flags |= READ;
    flags |= WRITE;
    printf("flags = %u\n", flags);
    return 0;
}

Сброс бита

Чтобы выключить флаг, выполните операцию AND с инвертированной маской: flags &= ~MASK.

В инвертированной маске в целевом бите находится 0, а во всех остальных — 1.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ | WRITE;
    flags &= ~WRITE;
    printf("flags = %u\n", flags);
    return 0;
}

Переключение бита

Чтобы инвертировать флаг, выполните операцию XOR с маской: flags ^= MASK.

Если флаг был включён, он выключится, и наоборот.

#include <stdio.h>
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = 0;
    flags ^= EXEC;
    printf("after toggle: %u\n", flags);
    flags ^= EXEC;
    printf("after toggle: %u\n", flags);
    return 0;
}

Проверка бита

Чтобы проверить, включён ли флаг, выполните операцию AND с маской и проверьте результат: flags & MASK ненулевой, если флаг установлен.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ;
    if (flags & READ)  printf("READ is on\n");
    if (flags & WRITE) printf("WRITE is on\n");
    else printf("WRITE is off\n");
    return 0;
}

Установка нескольких флагов

Объединяйте маски с помощью OR, чтобы установить несколько флагов одновременно.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = READ | WRITE | EXEC;
    printf("all set: %u\n", flags);
    return 0;
}

Одновременная проверка нескольких флагов

Чтобы проверить, что установлены все флаги из группы, выполните операцию AND с объединённой маской и сравните результат с самой маской.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)

int main(void) {
    unsigned flags = READ | WRITE;
    unsigned need = READ | WRITE;
    if ((flags & need) == need) printf("both present\n");
    return 0;
}

Вывод активных флагов

Переберите маски в цикле, чтобы вывести, какие флаги включены в данный момент.

#include <stdio.h>
#define READ (1u << 0)
#define WRITE (1u << 1)
#define EXEC (1u << 2)

int main(void) {
    unsigned flags = READ | EXEC;
    if (flags & READ)  printf("R");
    if (flags & WRITE) printf("W");
    if (flags & EXEC)  printf("X");
    printf("\n");
    return 0;
}

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

Чтобы узнать, сколько флагов включено, подсчитайте установленные биты, последовательно сбрасывая младший установленный бит.

#include <stdio.h>

int main(void) {
    unsigned v = 0b10110;
    int count = 0;
    while (v) {
        v &= (v - 1);
        count++;
    }
    printf("set bits = %d\n", count);
    return 0;
}

Перечисления для флагов

Использование enum помогает организовать определения флагов и сделать их понятнее.

#include <stdio.h>

enum { OPT_A = 1, OPT_B = 2, OPT_C = 4 };

int main(void) {
    unsigned opts = OPT_A | OPT_C;
    printf("opts = %u\n", opts);
    if (opts & OPT_C) printf("C enabled\n");
    return 0;
}

Быстрая проверка

Проверьте свои знания о масках и флагах.

Повторение

Вы научились управлять битовыми флагами:

  • Устанавливайте их с помощью flags |= MASK.
  • Сбрасывайте с помощью flags &= ~MASK.
  • Переключайте с помощью flags ^= MASK.
  • Проверяйте с помощью flags & MASK.
  • Определяйте маски как степени двойки, часто используя макросы или перечисления.

Часто задаваемые вопросы

Урок «Битовые маски и флаги» бесплатный?

Да — полный текст урока «Битовые маски и флаги» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C Academy, подпишись на CoddyKit PRO. Курс C Academy содержит 4 уроков всего.

Чему я научусь в уроке «Битовые маски и флаги»?

Устанавливайте, очищайте и переключайте биты Ты практикуешь C Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C Academy?

Предыдущий опыт не требуется. C Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Битовые маски и флаги»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C Academy?

Да. Каждый урок C Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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