Что такое флаг в программировании
Перейти к содержимому

Что такое флаг в программировании

  • автор:

Флаг (компьютерная техника)

В программировании понятие флаг относится к одному или нескольким битам памяти, используемым для хранения двоичной комбинации или кода, который характеризует состояние некоторого объекта. Флаги обычно входят в определённые структуры данных, такие как записи баз данных, и их значения, как правило, связаны со значением структур данных, частью которых они являются. Во многих случаях двоичное значение флага представляет собой кодированное представление одного из нескольких возможных состояний или статусов объекта. В других случаях двоичные значения флагов могут представлять собой один или несколько атрибутов в битовом поле, зачастую связанных с возможностями или доступом, например, «может быть записано в», или «может быть удалено». Однако флагам могут быть назначены и другие значения. Один из вариантов использования флагов состоит в маркировке для назначения структуры данных к последующей обработке.

В микропроцессорах и других логических устройствах флаги обычно используются для управления и индикации промежуточного или конечного состояния, а также для характеристики результата различных операций. Микропроцессоры как правило имеют регистр статуса, который состоит из таких флагов, используемых для обозначения различных состояний после операции, например, если произошло арифметическое переполнение. Флаги могут использоваться в управлении последовательностью операций, в частности, в обработке условных команд перехода. Например, по команде je (Jump if Equal, Переход по равенству) в ассемблере X86 произойдёт переход, если был установлен флаг Z (zero, ноль) на предыдущий операции.

См. также

  • Операционная система
  • Технологии процессоров

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «Флаг (компьютерная техника)» в других словарях:

Флаг переноса — CF (англ. Carry flag)  в электронных арифметических устройствах  специальный флаг, устанавливаемый в результате арифметического переноса или сдвига со старшего значащего бита. Для арифметической операции может рассматриваться как… … Википедия

Флаг (значения) — Флаг: Флаг  полотнище, служащее символом государства (региона, города) или используемое для передачи информации (например, на флоте). Флаг (ботаника), или парус  название одного из лепестков в венчике мотылькового типа. Флаг (нотная… … Википедия

Xenus. Точка кипения (компьютерная игра) — Xenus: Boiling point Разработчик Deep Shadows Издатели Games Factory Interactive Дата выпуска … Википедия

Регистр флагов — Регистр флагов  регистр процессора, отражающий текущее состояние процессора. Содержание 1 Архитектура x86 1.1 Флаги состояния 1.2 Управляющий флаг … Википедия

Серпухов — У этого термина существуют и другие значения, см. Серпухов (значения). Город Серпухов … Википедия

Acer Inc. — Acer Год основания 1976 Тип Публичная компания Расположение … Википедия

GIGABYTE Technology — Тип Публичная Девиз компании Upgrade your life Год основания 1986 Расположение … Википедия

Соединенные Штаты Америки — (США, USA) Соединенные Штаты Америки это страна в Северной Америке Соединенные штаты Америки (США) это одна из крупнейших мировых держав Содержание >>>>>>>>>>>>>>>>> … Энциклопедия инвестора

Hitachi, Ltd. — Hitachi, Ltd. Год основания 1910 Тип Публичная компания Девиз компании «Inspire the Next» («Предвосхищая будущее») … Википедия

— Hitachi, Ltd. Тип Публичная компания Листинг на бирже NYSE: HIT … Википедия

Для чего нужны переменные флаги

Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны и когда использовать.

Переменная флаг – это, как правило, переменная логического типа, значение который характеризует состояние некоторого объекта. В примере haveFive переменная которая хранит состояние есть ли в массиве пятерка.

Это переменная, которую вы можете использовать для управления потоком функции, позволяя вам проверять определенные условия во время выполнения вашей функции.

Не очень понятен вопрос, тем не менее попробую ответить в меру своего понимания.

Флаг это некая переменная, которая по сути является статусом некоторого объекта/сущности/множества. В классическом варианта флаг это булевская переменная, в более расширенном толковании флаг может иметь и несколько значений.

В зависимости от значения флага используется ветвление логики программы if и/или switch

Когда использовать? Флаги используются, когда статус сущности есть некая сложновычисляемая штука, поэтому чтобы зря не тратить каждый раз вычислительные ресурсы удобно запомнить статус сущности в виде флага и дальше использовать в логике программы. Например, в вашем случае то что массив содержит хотя бы одну пятерку — есть флаг.

Не могу не запостить цитату из любимого мною «Чистого кода»

Аргументы-флаги уродливы. Передача логического значения функции —
воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции. При истинном значении флага выполняется одна операция, а при ложном — другая! В листинге 3.7 у нас нет выбора, потому что вызывающая сторона уже передает этот флаг, а я хотел ограничить область переработки границами функции. Тем не менее вызов метода render(true) откровенно сбивает с толку бедного читателя. Если навести указатель мыши на вызов и увидеть render (boolean isSuite), ситуация слегка проясняется, но ненамного. Эту функцию следовало бы разбить на две: renderForSuiteO и renderForSingleTestO.

Использование флагов

Флагом (flag) называется алгоритм, который сообщает программе о том, что выполнено некоторое условие или произошло какое-то событие, так же как настоящий флаг, оставленный астронавтами на Луне, свидетельствует о том, что на лунную поверхность ступала нога человека. Переменной-флагу присваивается значение в начале выполнения программы или во внешнем цикле, а затем ей присваивается другое значение, указывающее на то, что произошло некоторое событие или было выполнено определенное условие.

Например, программа перевода значений температур использует цикл do. while для ввода значений:

printf(«Введите значение температуры

в пределах от 0 до 100: «);

Одна и та же подсказка появляется во всех случаях как при первом вводе, так и в случае ввода ошибочного значения. Возможно, было бы неплохо вывести на экран другое сообщение, указывающее пользователю, что он ввел неправильное значение. Текст программы, в которой именно так и сделано, приведен в Листинге9.4.

Листинг 9.4. Программа, в которой используется флаг для отображения альтернативных сообщений.

температуры от 0 до 100: «);

while (temp < 0 || temp > 100)

celsius = (5.0 / 9.0) * (temp — 32);

printf(«%d градусов по Фаренгейту

соответствует %6.2f по Цельсию\n», temp, celsius);

printf(«Желаете продолжить ввод?»);

while (repeat == ‘y’ || repeat == ‘Y’);

Переменной с именем flag в начале каждого внешнего цикла присваивается значение ‘n’. В начале каждого повтора внутреннего цикла значение флага проверяется. Если оно равно ‘n’, то программа выводит на экран одно сообщение, при любом другом значении флага на экран выводится второе сообщение.

При первом выполнении цикла флаг имеет значение ‘n’, поэтому на экран выводится первое сообщение. Когда пользователь вводит число, значение переменной меняется на ‘y’. Однако если пользователь ввел неправильное значение, внутренний цикл снова повторяется, но в этом случае условие (flag == ‘n’) не выполнится, так что на экран будет выведено второе сообщение.

Когда пользователь вводит правильное значение температуры, оно преобразуется в значение по шкале Цельсия, и внешний цикл повторяется. При следующем выполнении внешнего цикла флаг переустанавливается заново и пользователю предоставляется новый шанс ввести правильное значение температуры. Обратите внимание, что значение флага переустанавливается при каждом выполнении внешнего цикла, так же как значения счетчика и аккумулятора.

Хотя флаг и может быть определен с любым типом данных, рекомендуется все же выбирать для него тип int или char. Значения, присваиваемые флагу, также целиком определяет автор программы. В нашем примере использовалось значение ‘n’, чтобы отобразить правильный ввод данных, и ‘y’, чтобы отобразить неправильный ввод. Вы можете использовать любые другие значения, какие подскажет ваша фантазия.

O.1 – Битовые флаги и битовые манипуляции с помощью std::bitset

В современных компьютерных архитектурах наименьшей адресуемой единицей памяти является байт. Поскольку все объекты должны иметь уникальные адреса памяти, это означает, что объекты должны быть размером не менее одного байта. Для большинства типов переменных это нормально. Однако для логических значений это немного расточительно. Логические типы имеют только два состояния: true (1) или false (0). Для этого набора состояний требуется только один бит. Однако если переменная должна быть как минимум байтом, а байт равен 8 битам, это означает, что логическое значение использует 1 бит, а остальные 7 остаются неиспользованными.

В большинстве случаев это нормально – обычно мы не настолько ограничены в памяти, чтобы заботиться о 7 потерянных битах (мы лучше займемся оптимизацией для удобства понимания и поддержки). Однако в некоторых случаях с интенсивным хранением для повышения эффективности хранения может быть полезно «упаковать» 8 отдельных логических значений в один байт.

Для этого требуется, чтобы мы могли манипулировать объектами на битовом уровне. К счастью, C++ дает нам для этого инструменты. Изменение отдельных битов внутри объекта называется битовой манипуляцией.

Битовые манипуляции также полезны в алгоритмах шифрования и сжатия.

Примечание автора

Вся эта глава не обязательна для чтения. Не стесняйтесь её пропустить и вернуться позже.

Битовые флаги

До этого момента мы использовали переменные для хранения одиночных значений:

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

В качестве отступления.

В вычислениях флаг – это значение, которое действует как сигнал для некоторой функции или процесса. Для аналогии, в реальной жизни флаг почтового ящика используется, чтобы сигнализировать о том, что внутри почтового ящика что-то есть, и поэтому почтовый ящик не нужно открывать для проверки.

Чтобы определить набор битовых флагов, мы обычно используем целочисленный тип без знака соответствующего размера (8 бит, 16 бит, 32 бита и т.д., в зависимости от того, сколько у нас флагов) или std::bitset .

Лучшая практика

Битовые манипуляции – это один из немногих случаев, когда вы однозначно должны использовать беззнаковые целочисленные типы (или std::bitset ).

В этом уроке мы покажем, как легко манипулировать битами с помощью std::bitset . В следующем наборе уроков мы узнаем, как сделать это более сложным, но универсальным способом.

Нумерация битов и позиции битов

Учитывая последовательность битов, мы обычно нумеруем их справа налево, начиная с 0 (а не с 1). Каждое число обозначает позицию бита.

В данной последовательности битов 0000 0101, биты, которые находятся в позициях 0 и 2, имеют значение 1, а остальные биты имеют значение 0.

Управление битами через std::bitset

В уроке «4.13 – Литералы» мы уже показали, как использовать std::bitset для печати значений в двоичном формате. Однако это не единственная полезная вещь, которую может делать std::bitset .

std::bitset предоставляет 4 ключевые функции, которые полезны для работы с битами:

  • test() позволяет нам узнать, равен ли бит 0 или 1;
  • set() позволяет нам установить бит в 1 (она ничего не сделает, если бит уже равен 1);
  • reset() позволяет нам сбросить бит в 0 (она ничего не даст, если бит уже равен 0);
  • flip() позволяет нам инвертировать значение бита с 0 на 1, или наоборот.

Каждая из этих функций в качестве своего единственного аргумента принимает позицию бита, с которым мы хотим работать.

Эта программа напечатает:

Что, если мы хотим получить или установить сразу несколько битов

std::bitset не упрощает эту задачу. Для этого или, если вместо std::bitset мы хотим использовать битовые флаги в значениях целочисленных типов без знака, нам нужно обратиться к более традиционным методам. Мы рассмотрим их в следующих нескольких уроках.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *