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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> булеановские переменные 
V
    Опции темы
 
Что лучше?
Использовать общую переменную побитно [ 3 ]  [21.43%]
Использовать несколько переменных [ 5 ]  [35.71%]
Не важно, зависит от предпочтений программиста [ 6 ]  [42.86%]
Всего проголосовавших: 14
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
586
Дата 17.7.2006, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



В коде несколько булеановских переменных. Как их лучше реализовать? 
PM   Вверх
SergeCpp
Дата 17.7.2006, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

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



Это зависит от того, для чего они используются.

В Вашем случае — для чего?

Общего ответа, конечно же, нет.
В одном случае удобнее флаги, в другом — несколько переменных.
Всё зависит от специфики кода, приведите его... 
PM MAIL WWW ICQ   Вверх
takedo
Дата 17.7.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сначала с масками работать проблематично, но потом привыкаешь. Плюс этого состои в том, что ты всегда можешь перезадать маску, она в основном ведь объявляется так: #define maska 0x7E 


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
slava72
Дата 17.7.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть еще вариант битовых полей ;)

Код

// для особо экономных по памяти:
#pragma pack ... 

struct {
  bool fld1 : 1;
  bool fld2 : 1;
  unsigned fld3 : 2; // 2 бита
  ...
};


В этом случае не нужно думать о масках в побитовых операциях

2takedo для целочисленных констант лучше enum-ы, чем #define 
PM MAIL   Вверх
DeadSoul
Дата 17.7.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Почти всегда стоит выбирать
Цитата

Использовать несколько переменных


Аргументация: проще сопровождение 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Любитель
Дата 17.7.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Как вариант - std::bitset. И работать приятно, и пакерится. 


--------------------
PM MAIL ICQ Skype   Вверх
Никто
Дата 18.7.2006, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно представить переменную в виде последовательности битов,при этом экономится память. 
--------------------
   
PM MAIL   Вверх
586
Дата 19.7.2006, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Меня интересует вот что:
Код
String Function1(String s)
{
 String r, r1;
 BYTE b=0;
 r1='(';
 for(int i=1; i<=s.Length(); i++)
 {
  if((s[i]>=('a') && s[i]<=('z')) ||
    (s[i]>=('A') && s[i]<=('Z')))
  {
       if(b & 1) { r1+=','; b|=~1; }
       r+=s[i];
  }
  else if(((s[i]>='0') && (s[i]<='9')) || s[i]=='-')
  {
    r1+=s[i];
    b|=1;
  }else{
   if(b&2) break; else b|=2;
  }
 }
 r1+=')';
 r+=r1;
 return r;
}

String Function2(String s)
{
 String r, r1;
 BYTE b=0, bb=0;
 r1='(';
 for(int i=1; i<=s.Length(); i++)
 {
  if((s[i]>=('a') && s[i]<=('z')) ||
    (s[i]>=('A') && s[i]<=('Z')))
  {
       if(b) { r1+=','; b=0; }
       r+=s[i];
  }
  else if(((s[i]>='0') && (s[i]<='9')) || s[i]=='-')
  {
    r1+=s[i];
    b=1;
  }else{
   if(bb) break; else bb=1;
  }
 }
 r1+=')';
 r+=r1;
 return r;
}

Что выполнится быстрее? А если переменных будет 8?
Что быстрее: b|=1 или b=1
                       b|=~1 или b=0
                      (b&1) или (b)
А если в первой функции поставить DWORD вместо BYTE, а во второй оставить всё как есть?
Выигрываю ли я, задавая общую переменную? 
PM   Вверх
slava72
Дата 19.7.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



быстрее будет int (по определению ))

А код в том виде, в котором он есть a)-неэффективен б)-некорректен (не переносим)
неэффективен - для char (а возможно и для wchar_t) более быстро проверять по таблице
не переносим:  Об этом явно говорит Страус - в диапазоне [A..Z] могут быть лишние символы  и/или потерятся что-то нужное

чем не устраивают функции isalpha/isdigit ? или их самописные аналоги ;) 
PM MAIL   Вверх
UnrealMan
Дата 19.7.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(slava72 @  19.7.2006,  10:58 Найти цитируемый пост)
не переносим: Об этом явно говорит Страус - в диапазоне [A..Z] могут быть лишние символы и/или потерятся что-то нужное

А если быть реалистом, а не теоретиком-романтиком: много ли кодировок, где латинские буквы располагаются не по порядку или с разрывами? Можешь привести в качестве примера хотя бы одну? 
PM MAIL   Вверх
SergeCpp
Дата 19.7.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


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

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



Цитата(UnrealMan @  19.7.2006,  15:35 Найти цитируемый пост)
...в качестве примера хотя бы одну?

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


Опытный
**


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

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



Цитата(SergeCpp @  19.7.2006,  13:21 Найти цитируемый пост)
EBCDIC  

Вот я только её и знаю. 
PM MAIL   Вверх
UnrealMan
Дата 19.7.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мда, почитал статью и лишний раз убедился: EBCDIC – это задрипок, который почти нигде не используется. 
PM MAIL   Вверх
Nuzur
Дата 19.7.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

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



UnrealMan, ну рад за вас что вы наконец-то поняли  smile 
А на сабж точного ответа нет, если их 2-ве то конечно отдельные переменные, если их 10000 то лучше про биты думать. smile  


--------------------
Never again...
PM MAIL   Вверх
Earnest
Дата 20.7.2006, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Да наплевать, какая реализация. Написать нормальный интерфейс в виде get\set (которые тут недавно ругали), и переписывай реализацию хоть через день, под настроение. 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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