Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > булеановские переменные


Автор: 586 17.7.2006, 06:56
В коде несколько булеановских переменных. Как их лучше реализовать? 

Автор: SergeCpp 17.7.2006, 08:27
Это зависит от того, для чего они используются.

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

Общего ответа, конечно же, нет.
В одном случае удобнее флаги, в другом — несколько переменных.
Всё зависит от специфики кода, приведите его... 

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

Автор: slava72 17.7.2006, 10:21
Есть еще вариант битовых полей ;)

Код

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

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


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

2takedo для целочисленных констант лучше enum-ы, чем #define 

Автор: DeadSoul 17.7.2006, 22:10
Почти всегда стоит выбирать
Цитата

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


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

Автор: Любитель 17.7.2006, 22:30
Как вариант - std::bitset. И работать приятно, и пакерится. 

Автор: Никто 18.7.2006, 10:49
Можно представить переменную в виде последовательности битов,при этом экономится память. 

Автор: 586 19.7.2006, 09:07
Меня интересует вот что:
Код
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, а во второй оставить всё как есть?
Выигрываю ли я, задавая общую переменную? 

Автор: slava72 19.7.2006, 10:58
быстрее будет int (по определению ))

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

чем не устраивают функции isalpha/isdigit ? или их самописные аналоги ;) 

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

А если быть реалистом, а не теоретиком-романтиком: много ли кодировок, где латинские буквы располагаются не по порядку или с разрывами? Можешь привести в качестве примера хотя бы одну? 

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

http://en.wikipedia.org/wiki/EBCDIC 

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

Вот я только её и знаю. 

Автор: UnrealMan 19.7.2006, 13:53
Мда, почитал статью и лишний раз убедился: EBCDIC – это задрипок, который почти нигде не используется. 

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

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

Автор: 586 20.7.2006, 07:26
тема закрыта 

Автор: chaos 20.7.2006, 08:31
Цитата(586 @ 17.7.2006,  06:56)
В коде несколько булеановских переменных. Как их лучше реализовать?

можно поюзать STL'евски bitset 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)