LINUX.ORG.RU

Как уменьшить размер std::bitset?

 ,


0

1

Мне надо запаковать три битовых флага, которые имеют одинаковое значение (напр. как в std::vector<bool> isValid). Только давит жаба использовать std::bitset, ибо sizeof(std::bitset<3>) == 8.

Можно ли как-то в std::bitset подать размер хранилища?

★★★★★

Последнее исправление: KennyMinigun (всего исправлений: 1)

Примерно нет.

Точнее говоря, это определяется реализаций, и «в принципе» может быть предоставлена специализация для использования uint8_t/uint16_t/uint32_t вместо size_t для мелких размеров.

Но несложно сделать penni_wise_bitset<>.

Deleted
()

Для этого есть перечисления...

emun flag: uint8
{
Flag1 = 0b00000001
Flag2 = 0b00000010
Flag3 = 0b00000100
}

flag f = Flag1
If ( f & Flag1 ) ...

Или
struct flag{
uint8 f1 :1;
uint8 f2 :1;
uint8 f3 :1;
}

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

С перечислениями ничего не превращается. На упакованную в 1 байт структуру endianess точно не влияет, но я бы пр почитал стандарт на тему как определена упаковка полей в биты.

slovazap ★★★★★
()

Выше правильно пишут про Union, а про побитовый сдвиг забыли.

Пиши 3 бита в один байт, используй << и >>, напиши свой класс-оболочку. Все будет ок, можешь даже BE и LE предусмотреть.

aiqu6Ait ★★★★
()

Зачем вообще битсет — это детский сад для неосиляторов логики и сдвига.

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

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

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

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

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

int val;
udp.sendDatagram(QByteArray(&val, sizeof(val),...);
Приём
QByteArray data = ...
int &val = *reinterpret_cast<int*>(data.data());

Хочеш сказать, что это как-то повлияет на значение переменной val?

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

Зачем вообще битсет — это детский сад для неосиляторов логики и сдвига.

Слишком много «осиливать» выливается в нечитабельный код и трудноловимые баги.

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

Пиши 3 бита в один байт, используй « и », напиши свой класс-оболочку. Все будет ок, можешь даже BE и LE предусмотреть.

Ну, не хотелось велосипедить, чесно говоря. Надеялся, что кто-то уже написал.

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Про битовые поля понятно, в моем примере их нет, а в первом примере они были как альтернатива к перечислению.

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

Зависит от платформы. На TMCC2000 и на пикушки видел готовые решения от вендоров.

aiqu6Ait ★★★★
()
Ответ на: комментарий от LinuxDebian
struct flag{
uint8 f1 :1;
uint8 f2 :1;
uint8 f3 :1;
};

Это конечно хорошо, но в моем случае больше интересует operator[]. А именно чтоб не марать руки о писание bit_reference: https://en.cppreference.com/w/cpp/utility/bitset/reference

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

bool array = 0b0001000;

bool operator[](int I)
{
return 0x01 & (array >> I)
}

Естественно засунь это в класс...

Можно даже через темплейт сделать для универсальности...

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

Серьезно? Плохо там у тебя в твоей параллельной вселенной…

Ты совсем кукухой поехал что ли?

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

При отправке ты высылаешь 0x12:0x34:0x56:0x78, что на little endian соответствует uint32_t 2018915346.

При приёме на big endian ты получаешь те же 0x12:0x34:0x56:0x78 в том же порядке. Но на big endian это соответствует uint32_t 305419896. Потому что старший бит здесь 0x12, а не 0x78, как на little.

Так что перебирайся из своего маня-мирка, где всё хорошо и можно не парится, в нашу вселенную, где всё плохо, понаплодили всякой несовместимой херни, о которой ещё и думать приходится.

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