LINUX.ORG.RU
ФорумTalks

«Флаги» в языках программирования


0

1

Не знаю в какой форум отнести, так что пишу тут.
Часто в ЯП используются конструкции вида E_ALL ^ E_NOTICE, тоесть комбинирование некоторых «флагов», масок или констант... не знаю как правильно назвать. Вобщем, ткните носом где можно почитать как реализуется такая логика. Даже не знаю как сформировать запрос гуглу.

>Даже не знаю как сформировать запрос гуглу.

bit triks, bit hacks.

staseg ★★★★★
()

Если я тебя правильно понял, то я не понял, что тебе не понятно.
Есть флаговый(битовый) массив.
И c помощью элементарных логических операций биты выставляются в нужное значение.

Например был такой массив 00000000b, назовём его FLAG_ARRAY;
Допустим младший бит отвечает за E_ALL.
Следующий за E_NOTICE.

Лезешь куда-нибудь в хеадер и узнаешь, что эти термины обычные дефайны:
#define E_ALL 0x1
#define E_NOTICE 0x2

Чтобы выставить эти флаги берешь и делаешь:
FLAG_ARRAY || E_ALL
FLAG_ARRAY || E_NOTICE

В результате получаешь FLAG_ARRAY в виде 00000011b

Или твй вопрос намного хитрее и я его совсем не понял.

Stahl ★★☆
()
Ответ на: комментарий от Stahl

Впринципе, в точку.
Вот например я хочу реализовать функцию которая устанавливает некоторое состояние в зависимости от переданных ей флагов. Она должна принимать int, а это число будет вычисляться с помощью побитовых операций:
напр. E_ALL | E_ERROR ^ E_NOTICE
только не пойму как выставлять значения для этих констант чтобы напр.
E_ALL | E_ERROR
давало не то же самое что
E_ALL | E_NOTICE
Нужно каждой константе отводить свой бит? Я правильно понял?

vovchik542
() автор топика
Ответ на: комментарий от vovchik542

vovchik542> Нужно каждой константе отводить свой бит?
верно. итого в 4хбайтовой переменной можно хранить 32 флага.
значения можно задавать в виде

enum states{
E_ERROR = 1<<0,
E_NOTICE = 1<<1,
}

Tweaker ★★★★☆
()
Ответ на: комментарий от vovchik542

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

А вообще в девелопмэнт.

Yareg ★★★
()
Ответ на: комментарий от Tweaker

ага, становится понятнее. а как потом грамотно «распаковать» эту маску? переводить все комбинации в int и обрабатывать с помощью switch (RESULT_MASK)? Ну или обрабатывать каждый флаг отдельно, тогда как узнать что в результирующей маске нужный бит установлен?

vovchik542
() автор топика
Ответ на: комментарий от vovchik542

У K&R было про использование как флагов, так и битовых полей.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от vovchik542
if(state & E_NOTICE){
  \\then
}else if((state & E_ERROR) && (state & E_OVERFLOW)){
  \\then
}
Tweaker ★★★★☆
()
Ответ на: комментарий от vovchik542

как узнать что в результирующей маске нужный бит установлен


Возвращаемся к нашему примеру:
FLAG_ARRAY — 00000011b

#define E_NOTICE 0x2

Как проверить выставлен ли флаг?

FLAG_ARRAY&E_NOTICE (логическое И)

Если результат 0 — флаг сброшен, если не 0 — флаг установлен.

Почитай про битовые операции — там всё просто как портянка.

Stahl ★★☆
()

Всем спасибо, понял в каком направлении копать, буду разбираться.

vovchik542
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.