Флаг (компьютерная техника)
В программировании понятие флаг относится к одному или нескольким битам памяти, используемым для хранения двоичной комбинации или кода, который характеризует состояние некоторого объекта. Флаги обычно входят в определённые структуры данных, такие как записи баз данных, и их значения, как правило, связаны со значением структур данных, частью которых они являются. Во многих случаях двоичное значение флага представляет собой кодированное представление одного из нескольких возможных состояний или статусов объекта. В других случаях двоичные значения флагов могут представлять собой один или несколько атрибутов в битовом поле, зачастую связанных с возможностями или доступом, например, «может быть записано в», или «может быть удалено». Однако флагам могут быть назначены и другие значения. Один из вариантов использования флагов состоит в маркировке для назначения структуры данных к последующей обработке.
В микропроцессорах и других логических устройствах флаги обычно используются для управления и индикации промежуточного или конечного состояния, а также для характеристики результата различных операций. Микропроцессоры как правило имеют регистр статуса, который состоит из таких флагов, используемых для обозначения различных состояний после операции, например, если произошло арифметическое переполнение. Флаги могут использоваться в управлении последовательностью операций, в частности, в обработке условных команд перехода. Например, по команде 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 … Википедия
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Для чего нужны переменные флаги?
Я только недавно натолкнулся на этот термин, и я не понимаю для чего они нужны.
Я не уверен, когда использовать переменную флаг и как это сделать?
Если можно с примерами на Java. Спасибо.
boolean flag = false;
- Вопрос задан более трёх лет назад
- 11454 просмотра
3 комментария
Простой 3 комментария
gleendo @evgeniy8705
Вы про такие флаги говорите? boolean flag = false; или про JVM?
rraderio @rraderio Автор вопроса
gleendo @evgeniy8705
public boolean has(int key) < // Метод для проверки существования элемента например в списке boolean found = false; // Флаг, найден ли элемент или нет. По умолчанию не найден (false) if (find(key)) found = true; // Ищем элемент. Если находим то выставляем значение флага в true return found; // Возвращаем значение флага >
Решения вопроса 0
Ответы на вопрос 3
senior software developer
не нужно воспринимать флаги как что-то супер-специфическое или суперсложное
это не более чем обычная переменная которая влияет на поток программы
пример из жизни
вы программируете целый день на работе и вечером идете домой
допустим в течении дня может позвонить супруга и попросить зайти вечером в магазин (выставляет флаг ЗАЙТИ_В_МАГАЗИН = True)
в конце дня этот флаг проверяется — если он True — то мы зайдем в магаз, если нет — соответственно не зайдем
нюансы здесь:
— флаг может быть выставлен в ЛЮБОЕ время
— флаг не обязательно выставляете Вы сами!
— Ваша реакция на флаг не обязательно сиюминутная
— перед уходом домой лучше позвонить супруге и уточнить состояние флага 🙂
флаг не обязательно должен быть буленовской переменной, это понятие скорее логическое, например вместо флага ЗАЙТИ_В_МАГАЗИН (при котором не совсем понятно что покупать то) может использоваться более умная конструкция типа ArrayList списокПокупок = <>. Вначале дня список пустой, в течении дня жена вспоминает чтото — и дописывает вещи в спискоПокупок
в конце дня вы просто проверяете — пуст ли список (флага нет) — и тогда идете домой с чистой совестью
если же там есть хоть что-то (флаг поднят) — Вы уже знаете что 1) идти нужно 2) что именно нужно купить
Ответ написан более трёх лет назад
Комментировать
Нравится 4 Комментировать
Программист
Переменные флаги как правило глобальные переменные булевого типа и используется обычно для синхронизации выполнения подпрограмм в разных потоках. Понятие флаг установлен, флаг снят — эквивалентно true и false.
Что такое флаг в программировании
Когда мы писали тетрис на JavaScript, то использовали в нём флаг остановки игры:
// ставим флаг окончания
gameOver = true;
В тот раз мы не останавливались на флагах подробно, поэтому сделаем это сегодня — расскажем, что такое флаг в программировании и для чего он нужен.
Флаг — это индикатор
Когда водитель садится за руль машины, то он видит много индикаторов — приборов и лампочек, которые:
- показывают нам состояние различных узлов в машине (обороты двигателя);
- показывают, включён или выключен какой-то прибор (например, кондиционер или ближний свет);
- напоминают, что нужно что-то сделать (пристегнуться);
- сигнализируют о неисправности (контрольная лампа давления масла, если уровень масла в двигателе слишком низкий).
Глядя на эти индикаторы, водитель понимает, что ему нужно сделать — пристегнуться, остановиться, чтобы долить масло в двигатель или ничего делать не нужно.
Флаги в программировании делают то же самое — показывают, что происходит в программе, чтобы алгоритм или человек мог принять решение.
Программные флаги — это переменные, а аппаратные флаги используются в процессорах.
Откуда такое название
В программирование флаги пришли из армии и флота, когда с помощью разноцветных флагов корабли передавали сигналы друг другу. Также флаги используют военные, когда подают сигналы для управления техникой — например, поднятый красный флаг запрещает движение.
Программный флаг — это переменная
В случае с тетрисом мы взяли логическую переменную gameOver и присвоили ей значение true — это называется «установить флаг». Эта переменная показывает, закончилась игра или нет: если true, то да, закончилась, а если false — можно играть дальше.
Но флаг сам по себе бесполезен, если на него никто не смотрит. Если мы просто установим флаг, то игра не закончится сама по себе — нам нужно периодически проверять, в каком состоянии флаг. Для этого в код в нужных местах добавляют проверку флага: смотрят, чему равен флаг, и если он сработал — выполняют определённые действия. В тетрисе мы делаем это в самом начале обработчика нажатия клавиш — если флаг сработал, то сразу останавливаем игру и выводим надпись Game Over.
Аппаратный флаг — регистр в процессоре
Процессор — это микросхема из миллиардов транзисторов, но ему тоже иногда нужны флаги, чтобы понять:
- перед ним чётное число или нет;
- произошло ли переполнение буфера;
- есть ли что-то в стеке, куда нужно вернуться после этой операции;
- в каком режиме работать.
Для этого в процессоре есть специальные регистры — хранилища данных, которые могут принимать различные значения. Технически это тоже как бы виртуальные переменные, только они влияют не на одну программу, а на весь процессор.
Аппаратные флаги в процессоре обрабатываются автоматически, в зависимости от используемых команд.
Зачем нужны флаги
Главная задача флага в программировании — показать, что что-то изменилось и что нужно на это отреагировать. Например:
- кубик вылез за игровое поле и нужно остановить игру;
- пользователь слишком много раз ввёл неправильный пароль — тогда программа поставит флаг и в ближайший час не пустит его в систему;
- процедура закончила рисовать интерфейс и установила свой флаг — в этом случае система поймёт, что можно разрешить пользователю нажимать на кнопки;
- система заметила подозрительную активность и установила специальный флаг — в этом случае она будет записывать все действия пользователя, пока флаг не снимется.
Флаг — удобный способ передать информацию внутри алгоритма, чтобы в нужный момент принять верное решение.
Рекламный блок «Яндекс Практикума»
Этот рекламный блок сообщает, что после обучения в «Яндекс Практикуме» вы можете получить высокооплачиваемую работу разработчика, тестировщика, аналитика, менеджера и дата-сайентиста.
7. Переменные-флаги
Флаг – это полотнище правильной (как правило, прямоугольной) формы прикрепленное к древку или поднимаемое на специальной мачте (флагштоке). Исторически флаги появились для передачи простых сигналов на поле боя. Например: подняли флаг, и конница понеслась в атаку! Как-то так. В простейшем случае с помощью флага передается информация объемом 1 бит (одно из двух: флаг поднят или нет). Переменная флаг – это, как правило, переменная логического типа, значение которой сигнализирует о состоянии вычислительного процесса. Приведем несколько примеров, когда результат может характеризоваться всего одной логической переменной: 1) Подводится баланс коммерческого предприятия. Дальнейшие действия могут зависеть от того, будет он положительным или отрицательным. Если отрицательный, надо просить кредит, положительный – планировать отдых на Багамах. В общем, самая существенная информация может быть передана одним битом. 2) Решаем квадратное уравнение. Если дискриминант не отрицательный – ищем корни. Для хода вычислительного важен факт не отрицательности, который также содержит 1 бит информации и может, таким образом, быть сохранен с помощью логической переменной. 3) Детям на уроке физкультуры велено построиться по росту. Если они построились не по росту, надо на них наорать. Опять действия учителя зависят от информации объемом 1 бит. Но кто и кому может передавать информацию в ходе выполнения программы? Дело в том, что при разработке больших программ происходит разделение задачи на более мелкие подзадачи (блоки), каждая из которых решается отдельно и, может быть даже, разными людьми. В этом случае один блок, закончив свою работу должен передать ее результат другому блоку. Здесь и могут пригодиться флаги. Пример 1. Решение квадратного уравнения. Предположим, что программу решения квадратного уравнения пишут два человека (ну, можно же). Пусть первый умеет решать квадратные уравнения, но не знает, как вывести результат (не ходил на лекции). Второй знает, как вывести результат, но про квадратные уравнения слышит первый раз в жизни. Попробуем представить, какую программу они напишут.
var a, b, c: real; d: real; x1, x2: real; RootsExist: boolean; begin readln(a, b, c); d := sqr(b)-4*a*c; RootsExist := (d>=0); if RootsExist then begin x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); end; if RootsExist then writeln(x1, x2) else writeln('Roots don’t exist'); end.
Переменная-флаг передает информацию о наличии корней. С ее помощью первый блок сигнализирует второму блоку. Вы скажете, почему бы второму программисту вместо строчки
if RootsExist then
не написать
if d>=0 then
Зачем использовать еще одну переменную? Давайте вспомним, что второй программист ничего не знает о квадратных уравнениях и в частности не в курсе, что наличие корней определяется знаком дискриминанта. Не вдаваясь в тонкости чужой задачи, он просто просит первого программиста передать существенную информацию, через переменную-флаг. На таком простом примере, как решение квадратного уравнения трудно проникнутся ощущением полезности флагов. Я, пожалуй, соглашусь, что в данном случае флаг это лишнее. Однако, нетрудно представить себе более сложную задачу, где такой подход окажется полезным. Представьте себе, что вам требуется написать программу размером несколько тысяч строк (это сравнительно небольшая программа). Есть единственный способ создавать программы такого размера – это разбиение решаемой задачи на подзадачи и написание отдельных блоков программы, решающих каждый свою подзадачу. Чтобы можно было сосредоточиться на решении отдельной подзадачи надо сделать их решение по возможности максимально независимым друг от друга. Для этого от одного блока к другому должно передаваться как можно меньше информации. Так что даже если программу пишет всего один человек, флаги облегчат его работу. Как уже отмечалось, флаги минимизируют информацию, передаваемую между блоками. Так в примере с квадратным уравнением использование флага позволило передавать всего 1 бит вместо 8-ми байт, которые пришлось бы потратить на значение дискриминанта. Общий принцип здесь такой – чем меньше информации, тем труднее допустить ошибку. При разработке сложных программ поиск ошибок занимает больше времени, чем собственно их написание и любая возможность уменьшить вероятность их появления должна приветствоваться. В дополнение еще один пример. Пример 2. Проверка упорядоченности последовательности. Пользователь вводит 10 чисел. Требуется проверить, упорядочены ли они по возрастанию, и передать эту информацию с помощью переменной флага. Решение:
Growing:=true; readln(x); for i:=2 to 10 do begin x2:=x; readln(x); Growing:=Growing and (x > x2); end;
Если очередное введенное число (x) будет меньше предыдущего (x2), то флаг примет значение false и сохранит это значение до конца цикла. Блоки, передающие друг другу информацию с помощью флагов, не обязательно должны идти последовательно друг за другом. Можно представить себе ситуацию, когда один блок является составной частью другого. Например: Пример 3: Найти все простые числа от 1 до N. Число называется простым, если не делится ни на какое другое число кроме 1 и самого себя. Простейший алгоритм поиска таких чисел состоит в том, чтобы перебрать все числа и для каждого проверить наличие делителей. Поиск делителей можно мыслить себе как отдельный блок программы, результатом работы которого будет присваивание значения флаговой переменной.
Блок поиска простых чисел будет включать в себя блок проверки на наличие делителей.
Программную реализацию этого алгоритма выполните в качестве самостоятельного упражнения (см. задачу 7.1). Не обязательно использовать в качестве флага именно логическую переменную. В принципе флагом может считаться любая переменная, принимающая небольшое количество возможных значений, каждое из которых характеризует тот или иной результат вычислительного процесса.
В примере с квадратным уравнением можно было бы предусмотреть еще одну ситуацию, когда a = 0, то есть уравнение не квадратное. Тогда для передачи информации в следующий блок можно использовать либо две переменные логического типа, либо одну, но принимающую три значения (в качестве таковой можно использовать, например, переменную целого типа). Следующий раздел: