![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Привет всем. Я много раз видел применение флагов во встроенных функциях, но как применить их в своей функции, ума не приложу. Я вообще не представляю, что это. Пожалуйста, приведите простой пример приема флага в качестве аргумента в функции и вызов этой функции.
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Не до конца понял, что ты хочешь, но, кажется, это (или нет?)
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
borisbn, да-да, это то, что было нужно! Но как это работает? Что делает операция |, &, обязательно ли в 16-ричной системе? Пожалуйста, дайте ссылку или объясните. Я, правда, ничего не нашел.
|
|||
|
||||
asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
нужно знать как цифры представлены в двоичном виде. 1 = 1 2 = 10 3 = 11 4 = 100 5 = 101 6 = 110 7 = 111 8 = 1000 тебе нужны только те в которых только одна единица, типа 1, 2, 4, 8, 16, если присмотреться то можно заметить что это степени двойки. есть например у тебя функция которая выводит номер в консоль, как параметр она принимает номер и флаги, типа как именно выводить
|
|||
|
||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
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 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
azesmcar, оператор | по-моему делает то же самое, что и оператор +
![]() А оператор & возвращает число с такими включенными битами, которые были включены и в первом операнде и во втором? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Hagrael
Я же описал, что делают эти операторы. Если бы оператор | делал тоже, что и оператор +, то нафиг он вообще нужен этот лишний оператор? Пользовались бы плюсом и дело с концом. Это битовые операции, они делают побитовый OR и побитовый AND, т.е. выполняют и для каждого бита и возвращают результат. |
|||
|
||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
что то похожее на сложение дает xor (оператор ^)
0^0=0 1^0=1 0^1=1 1^1=0 1+1=2 или в двоичной системе 01+01=10. т.е. последний бит сбрасывается. |
|||
|
||||
borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
http://liveworkspace.org/code/a63c4684e167...af536ba20b655ae
![]() Добавлено через 1 минуту и 51 секунду на что похоже и чем ? ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
ller |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.8.2008 Где: г. Таганрог Репутация: 2 Всего: 4 |
На оператор +
![]() 1^1=0 1+1=0 + переполнение, ну или что то в этом роде. Я так думаю! ![]() |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
ller, в принципе ты прав. XOR ещё называют "сложение по модулю 2". Т.е.
где X и Y - одиночные биты (значение X может быть либо 0 либо 1. Для Y - то же самое) % - остаток от деления -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Спасибо за помощь
![]() |
|||
|
||||
voral |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
Б. Керниган, Д. Ритчи - Язык Си - Глава 6.9 Битовые поля
Кроме описанного варианта есть такой:
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |