| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Флаги |
| Автор: Hagrael 27.7.2011, 15:10 |
| Привет всем. Я много раз видел применение флагов во встроенных функциях, но как применить их в своей функции, ума не приложу. Я вообще не представляю, что это. Пожалуйста, приведите простой пример приема флага в качестве аргумента в функции и вызов этой функции. |
| Автор: borisbn 27.7.2011, 16:18 | ||
Не до конца понял, что ты хочешь, но, кажется, это (или нет?)
|
| Автор: Dem_max 27.7.2011, 16:30 | ||
|
| Автор: Hagrael 27.7.2011, 19:55 |
| borisbn, да-да, это то, что было нужно! Но как это работает? Что делает операция |, &, обязательно ли в 16-ричной системе? Пожалуйста, дайте ссылку или объясните. Я, правда, ничего не нашел. |
| Автор: asmdzen 27.7.2011, 21:11 | ||
нужно знать как цифры представлены в двоичном виде. 1 = 1 2 = 10 3 = 11 4 = 100 5 = 101 6 = 110 7 = 111 8 = 1000 тебе нужны только те в которых только одна единица, типа 1, 2, 4, 8, 16, если присмотреться то можно заметить что это степени двойки. есть например у тебя функция которая выводит номер в консоль, как параметр она принимает номер и флаги, типа как именно выводить
|
| Автор: azesmcar 27.7.2011, 21:11 | ||||||||
| Hagrael В одном байте 8 бит, т.е. флагов (1 или 0). 1 означает, что флаг установлен, 0 - что флага нет. Допустим мы используем тип char, размер которого 1 байт. В него можно установить 8 битов. Назначаем каждому биту определенное имя, допустим речь идет о доступе. 0 - read 1 - write 2 - execute (ну прямо как в unix) теперь создаем перечисление
операция | (т.е. bitwise OR) работает так 1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0 т.е. если оба бита нулевые, то результат будет нулевым. Рассмотрим пример 01010010 OR 11010100 ------------- 11010110 теперь посмотрим, что происходит с нашим перечислением
001 OR 010 ----- 011 - 3 в двоичном виде, т.е. мы даем доступ на чтение и на запись. Теперь второй этап - проверка флага Здесь используется операция & (т.е. bitwise AND). Работает она так 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 т.е. если хотя бы один из битов нулевой - результат будет нулевым. Применяем это к нашему char-у, в котором на данный момент записано число 3 (011 в бинарном виде).
получается так 011 AND 001 ----- 001 выходит что флаг access_read установлен, так-как результат не нулевой. т.е. проверка
проверяет установлен ли флаг access_read, а скобки нужны для приоритета. |
| Автор: Hagrael 28.7.2011, 07:15 |
| azesmcar, оператор | по-моему делает то же самое, что и оператор + А оператор & возвращает число с такими включенными битами, которые были включены и в первом операнде и во втором? |
| Автор: azesmcar 28.7.2011, 08:07 |
| Hagrael Я же описал, что делают эти операторы. Если бы оператор | делал тоже, что и оператор +, то нафиг он вообще нужен этот лишний оператор? Пользовались бы плюсом и дело с концом. Это битовые операции, они делают побитовый OR и побитовый AND, т.е. выполняют и для каждого бита и возвращают результат. |
| Автор: ller 28.7.2011, 08:19 |
| что то похожее на сложение дает xor (оператор ^) 0^0=0 1^0=1 0^1=1 1^1=0 1+1=2 или в двоичной системе 01+01=10. т.е. последний бит сбрасывается. |
| Автор: ller 28.7.2011, 08:54 |
| На оператор + 1^1=0 1+1=0 + переполнение, ну или что то в этом роде. Я так думаю! |
| Автор: borisbn 28.7.2011, 09:49 | ||
ller, в принципе ты прав. XOR ещё называют "сложение по модулю 2". Т.е.
где X и Y - одиночные биты (значение X может быть либо 0 либо 1. Для Y - то же самое) % - остаток от деления |
| Автор: Hagrael 30.7.2011, 08:08 |
| Спасибо за помощь |
| Автор: voral 30.7.2011, 09:14 | ||
| Б. Керниган, Д. Ритчи - Язык Си - Глава 6.9 Битовые поля Кроме описанного варианта есть такой:
|
| Автор: Alca 30.7.2011, 09:26 |
| CFlags.h |