Битовые маски и флаги
Устанавливайте, очищайте и переключайте биты
«Битовые маски и флаги» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Побитовые операторы
- Сдвиги
- Битовые маски и флаги
- Практические приёмы работы с битами