LINUX.ORG.RU

Битовые поля

 ,


0

1

Привет. Есть структура вида:

struct {
   struct {
      unsigned a : 1;
      unsigned b : 1;
      ...
   } p;
} MyStruct;
все поля по одному биту. Есть ли быстрый способ узнать, возведён ли хоть один бит без if'a по каждому полю?

Покумекал тут. Вносите царя, короче:

   bool pChanged = false;
   int numberOfBytes = sizeof(((MyStruct*)0 )->p) / sizeof(int);
   int* pBitField = reinterpret_cast<int*>(&myStruct.p);
   while (numberOfBytes > 0) {
      if (*pBitField) {
         pChanged = true;
         break;
      }
      ++pBitField;
      --numberOfBytes;
   }

★★★★★

Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от emulek

поля проверяет. Что тебе непонятно? Операция || ?

Мне непонятно, почему он флаги перепрыгивает и проверят только нечётные.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Мне непонятно, почему он флаги перепрыгивает и проверят только нечётные.

так в коде приказано.

emulek
()
Ответ на: комментарий от UVV

нет, с STL оно сейчас само линкуется, без лишних телодвижений.

emulek
()

Вот, кстати, пример, в чём паскаль лучше си - там есть встроенные множества (set), и проверки по ним записываются кратко и наглядно.

Хотя если бы автор уточнил, что имеет в виду именно c++, а не c, то таки stdшные множества тоже неплохо (но подозреваю, что менее эффективно). А то теги вводят в недоумение.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от hobbit

Вот, кстати, пример, в чём паскаль лучше си - там есть встроенные множества (set)

мне отчего-то кажется, что битики ТС взял из физической сущности - это или бинарный пакет прибывший по сети или (хотя маловероятно) поле/копия регистров контроллера. В этом случае Паскалевский set как-бэ неподоходит и возня за скорость оправданна.

во всех прочих вариантах - битовые поля не к месту. Тем паче что С++ присутствует в тегах.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

во всех прочих вариантах - битовые поля не к месту. Тем паче что С++ присутствует в тегах.

битовые поля - это сгенерированный код. В моём случае мы его используем в приложении на Qt, но подобный код генерируется так же и для embedded и других платформ.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

битовые поля - это сгенерированный код

Тогда какие проблемы сгененрировать нужную функцию?

anonymous
()
Ответ на: комментарий от UVV

битовые поля - это сгенерированный код

жестя какая :-) Генератор трахается упаковывая биты, затем интерпретатор делает подобное их распаковывая. Экономия 30 байт на винте?

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

Тогда какие проблемы сгененрировать нужную функцию?

Хороший вопрос. Надо вздумнуть над этим.

UVV ★★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

Не совсем. Если интересно, то это список флагов типа attributePresent. Если он не взведён, то и не стоит копировать / выделять память / обрабатывать соответствующий атрибут.

UVV ★★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

а генератор не в силах поставить общий флаг ?

Общий флаг как раз и есть, и выставить его значение - моя задача как пользователя сгенерированного кода.

или счётчик взведённых флагов.

Нет.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Общий флаг как раз и есть, и выставить его значение - моя задача как пользователя сгенерированного кода.

значения битов кто ставит - генератор?

imho РАЗУМНО: если он, то пусть он и считает есть ли хоть один флаг. Если он определяет состав флагов - то действительно надо генерять код, как выше сказали. В обоих случаях скорость работы генератора очевидно не важна, важна очевидность его результата.

MKuznetsov ★★★★★
()
Ответ на: комментарий от UVV

получается генератор генерит класс «MyClassWithBits» (по ошибке названный структурой), где-то кто-то штатно делает экземпляр, а потом вы кастуете его кишке на byte* и потихоньку потрошите.

Чё-то как-то запущенно в Датском королевстве :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Опять же, «кто-то» и «вы» - это одно лицо.

UVV ★★★★★
() автор топика
Ответ на: комментарий от MKuznetsov

Чё-то как-то запущенно в Датском королевстве :-)

Безусловно у тебя всё в шоколаде с блэкджеком и шлюхами.. ;)

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Безусловно у тебя всё в шоколаде с блэкджеком и шлюхами.. ;)

неплохо - грех жаловаться :-)

ps/ не обижайся - пиши генератор

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

ps/ не обижайся - пиши генератор

Ок, но я более со стороны GUI =)

UVV ★★★★★
() автор топика
Ответ на: комментарий от ck114

Я уже выше объяснил, что код менять не могу.

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.