Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значения элементов списка, Зачем присваивать значения елементам 
:(
    Опции темы
Purple_Light
Дата 24.12.2008, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Часто встречаю следующее определение структур:
Код

enum SomeStructure {
   item1 = 0x00000001,
   item2 = 0x00000002,
   item3 = 0x00000004,
   item4 = 0x00000008
}


Раскажите пожалуйста, почему  значения item именно такие (как я понимаю в шеснадцатеричном представлении)? Какие плюсы это дает, почему просто не использовать 1, 2, 3, 4 и т.п. Подозреваю, наверно потому, что можно производить логические опирации над item (например &, |, ^), но хочется исчерпывающей информации по этому вопросу.
PM MAIL   Вверх
mes
Дата 24.12.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Purple_Light @  24.12.2008,  12:39 Найти цитируемый пост)
enum SomeStructure {
   item1 = 0x00000001,
   item2 = 0x00000002,
   item3 = 0x00000004,
   item4 = 0x00000008
}

Такое для лучшей наглядности записывается так :
Код

enum SomeStructure {
   item1 = 1 << 0,
   item2 = 1 << 1,
   item3 = 1 << 2,
   item4 = 1 << 3
};

т.е каждый элемент енума ассоциирусется с определенным порядковым битом, чтоб в последствии можно было легко    групировать и проверять битовой маской.


--------------------
PM MAIL WWW   Вверх
Purple_Light
Дата 24.12.2008, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Цитата(mes @ 24.12.2008,  13:22)
 чтоб в последствии можно было легко    групировать и проверять битовой маской.

можно небольшой пример или ссылку на информацию, в плане практического использования.
PM MAIL   Вверх
mes
Дата 24.12.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вот условный пример :
Код

bool bits_in (int mask, int val) { return  (val & mask)==mask; }

enum Border {
   eTop = 1 << 0,
   eBottom = 1 << 1,
   eLeft = 1 << 2,
   eRight = 1 << 3,
   eAll = eTop|eBottom|eRight|eLeft
};


Window::DrawBorder (Border b)
{
    if (bits_in(Border::eTop) DrawTopBorder (); // рисуем верх
    if (bits_in(Border::eTop && Border::eRight) DrawRightTopCorner (); // рисуем правый верхний угол
    if (bits_in(Border::eRight) DrawRightBorder ();// рисуем правую сторону
}


Window * w = new Window (..., Border::eAll);



Это сообщение отредактировал(а) mes - 24.12.2008, 14:10


--------------------
PM MAIL WWW   Вверх
Purple_Light
Дата 24.12.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



на сколько я понимаю очень удобно использовать подобные структуры для задания начальных параметров, например:
если есть такая структура,

Код

enum SomeStruct {
   item1 = 0x00000001,
   item2 = 0x00000002,
   item3 = 0x00000004,
   param1 = 0x00000100,
   param2 = 0x00000200,
   param3 = 0x00000400
}


то можно в функцию с интерфейсом
Код

void f(enum SomeStruct s);


можно посылать значения типа (насколько я понимаю):
Код

f(item2 | param1)


но как их потом обрабатывать?
Код

void f(enum SomeStruct s)
{
  // Как обработать значения s? Как определить, что было задано значения item2 | param1?
}

PM MAIL   Вверх
mes
Дата 24.12.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Purple_Light @  24.12.2008,  14:14 Найти цитируемый пост)
// Как обработать значения s? Как определить, что было задано значения item2 | param1?

Цитата(mes @  24.12.2008,  14:10 Найти цитируемый пост)
(val & mask)==mask;




--------------------
PM MAIL WWW   Вверх
Owen
Дата 24.12.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 5.7.2006
Где: Русь

Репутация: нет
Всего: нет



Такое определение, можно сказать, задает битовую маску.
1) каждое значение является степенью двойки и задает какой-либо бит в значении. так:
1 = 0b1
2 = 0b10
4 = 0b100
потому использовать значение 100 (dec) не пройдет, тк 100 = 0b1100100 -- задает много битов и пересекается с 4 по 3му биту.
2) для работы с битовыми масками используем побитовые логические операции: и, или -- это основное, иногда -- исключающее или.
PM ICQ   Вверх
Purple_Light
Дата 24.12.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Спасибо за объяснения.
mes спасибо за пример
PM MAIL   Вверх
Purple_Light
  Дата 24.12.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 19.4.2007

Репутация: нет
Всего: нет



Снова поднимаю тему.

написал простую программу где
Код

void f(Flags flg);


Все хорошо, до тех пор, пока я не пытаюсь передать несколько флагов в функцию. Например
Код

f(Flag1 | Flag2);

где Flag1 и Flag2 пренадлежат соответственно enum Flags.
В этом случае выдается ошибка 
cannot convert parameter 1 from 'int' to 'Flags'
но я не хочу менять входящее значение на int, так как придется проверять входящее значение на валидность. Кроме того, если все такие изменить интерфейс функции на int, функция перестает определять флаги.

Помогите объяснениями   smile 
PM MAIL   Вверх
Owen
Дата 26.12.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 5.7.2006
Где: Русь

Репутация: нет
Всего: нет



Код

void vunc( uint aParam )
{
   ...
   if( aParam && ( flag1 || ... || flagX ) )
   {
    ...
   }
   ...
}

PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.