![]() |
|
![]() ![]() ![]() |
|
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Всем привет!
В программе нужно использовать набор флагов (около 10, а потом может и больше). Просто создать кучу bool'ов и взиться с ними - желания нет. Вспомнил как в Билдере и WinAPI используется DWORD для хранения флагов. Стал разбираться: взвести флаг можно с помощью операции - '|'; проверить взведён или нет - '&'. А вот как его сбросить? И правильно ли я понял две предыдущие операции? Подскажите, где об этом можно почитать, а то даже не знаю, что в поиске писать... ![]() -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Ты всё понял неправильно. & - это операция "и", а | - это операция "или". Подерживается чуть ли не всеми компиляторами чуть ли не всех языков. Смысл тут таков - эта операция действует по известной таблице истинности, пораспрашивать о которой ты сможеш у гугла.
Второй момент - если потребуеться больше 8 флагов, то и DWORD ьебя не выручит, используй двухбайтовую переменную (причём тип в принципе не важен). И в заключение:
|
|||
|
||||
Comm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 31.8.2007 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
А что означает цифра "1" в выражении
-------------------- =))))) ![]() |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
||||
|
||||
UniBomb |
|
|||
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Сорри, вот тут я ступил))) У меня почему то DWORD всё время вызывает странные ассоциации. ![]() Выражение "1 << 3" означает число "1", сдвинутое на три бита вправо. |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
как вариант я бы порекомендовал заюзать enum. в принципе имхо достаточно просто выполнять побитовые операции над DWORD - но он 32 бита, а тебе надо всего 10. Можно обойтись и двухбайтовым типом. Работать либо смещением, либо через std::bitset |
|||
|
||||
artsb |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Спасибо за ответы.
Значит изучение дискретной математики не прошли даром. ![]() Но мне хотелось бы это реализовать наподобии как в функции MessageBox:
Дело в том, что эти флаги я использую в классе, а класс в программе. Не хочется открывать прямой доступ к флагам. Хочется реализовать доступ через функции, например:
и чтобы устанавливать так:
Можно подробнее. Точнее, то что это перечисление я знаю. Надо вспомнить как с ним работать. ![]() Это сообщение отредактировал(а) artsb - 4.2.2009, 10:40 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||||
|
|||||||
mrbrooks |
|
||||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Перечисления особенно хороши со множеством.
Добавлено через 4 минуты и 20 секунд для проверки - есть ли данный флаг во множестве - используется метод Contains Это сообщение отредактировал(а) mrbrooks - 4.2.2009, 11:01 |
||||
|
|||||
Comm |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 269 Регистрация: 31.8.2007 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
Остроумно ![]() Это сообщение отредактировал(а) Comm - 4.2.2009, 11:11 -------------------- =))))) ![]() |
|||
|
||||
artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Ну с перечислением понятно. А как насчёт первого варианта? Как это можно организовать через функции, например, как у MessageBox.
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
Rrader |
|
||||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 13 Всего: 191 |
artsb, для этого нужно выполнить одно условие - не допускать перекрытия флагов, математически. А для этого их можно дефинировать так:
Теперь пользуйся ими как обычно:
Для включения флага - OR (|), для исключения - AND NOT (&~) Для проверки в функции применять можно AND:
Это сообщение отредактировал(а) Rrader - 6.2.2009, 06:17 |
||||||
|
|||||||
artsb |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Спасибо всем за помощь!
Rrader, что значит UL? Здесь:
Значит, в моём случае функции будут выглядеть так:
А используем, например, так:
ЗЫ надо бы где-то почитать про работу с битами. Смещение там и т.д. Не подскажите, где можно найти статьи про это? Это сообщение отредактировал(а) artsb - 5.2.2009, 22:56 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||||
|
|||||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
пару замечаний: даже если кол-во флагов меньше 16, не стоит использовать WORD, так как это "неродная" разрядность для 32х-битного кода, в следствие чего и код разбухает(за счет префиксов, но, надо отметить, разбухает весьма незначительно в текущих реалиях) и скорость снижается(опять же, незначительно).
посему, так будет лучше:
суффикс, определяющий тип числовой константы. unsigned long. (F1, Предметный указатель, constants, long) http://www.google.ru/search?q=двоичная+система+счисления |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 4 Всего: 72 |
Вместо #define можно использовать enum:
Так удобнее, отладчик будет знать значения флагов и при необходимости можно ограничить видимость флагов разместив их в namespace или в классе. Добавлено через 3 минуты и 26 секунд Ещё упрощение кода:
|
||||
|
|||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 13 Всего: 191 |
math64, dumb дело говорит.
Это сообщение отредактировал(а) Rrader - 6.2.2009, 18:15 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |