ну есть же битовые поля в структурах:
struct X
{
unsigned int x: 12;
};
почти что даром.
=A=L=X=
sizeof() говорит что это 4 байта.
Однако придется выгрызать биты из байта.
если нужна скорость и не сильно жалко память, то и не стоит напрягаться, храни 12 бит в 16, похожим образом в процах хранятся числа, в десятичной системе счисления, используя 4 бита (16 комбинаций) для десятичного числа (10 комбинаций). (для тех кто в танке, называется двоичнодесятичная система) а вот если гемор хочется побыстрее, то велком в увлекательный мир программирования.
my.name
Это как раз и нужно для сбережения памяти.
OberMeister
> =A=L=X=
> sizeof() говорит что это 4 байта.
потому что округлилась
struct X { unsigned int x: 12; unsigned int y: 24; };
так тоже будет 4 байта
Это вам не во флейме флеймить.
template<int size> class Bitfield { public: bool operator [](unsigned int i) { unsigned int byteid = i / 8, bitid = i % 8; return data[byteid] & ( 1 << bitid); } private: char data[size / 8 + 1]; };
Это в первом приближении. Оператор [] не будет работать на присваивание, но тут уже думай сам, мне дальше лениво расписывать.
Корован Историй
> size / 8 + 1
не так!
size / 8 + ((size % 8) ? 1 : 0)
OberMeister
> Есть идея сделать хороший формат рисунка (выгода в качестве и размере) (c) МОЁ
С потерями даных? Без? Сколько бит на компонент? Другими словами хочеться больше услышать о выгоде, потому что есть подозрение что среди уже существующих форматов возможно есть и покруче того, что ты пытаешся придумать....
Kloun
Один байт не жалко, а огород городить - сам не разберёшься потом.
Breezy
>есть подозрение что среди уже существующих форматов возможно есть и покруче того
конечно есть, просто соберу тестовую версию там уже будет видно. :)
Корован Историй
у меня впринцепи суть таже но я хотел сделать подобие fread() fwrite()
о таком варианте неподумал. Спасиб.
поправко
bool operator [](unsigned int i) { return data[i >> 3] & ( 1 << ( i&7)); }
правка: а хотя нет, не так, нда пох...
Корован Историй
> Один байт не жалко, а огород городить - сам не разберёшься потом.
как было указано выше - цель экономия памяти.
да и плюс еще выравнивание - если мы используем 32 бита, то получаем в итоге 5 байт - если выравниваем структуру то теряем уже не 1 а 4 байта
OberMeister
Похоже то, что тебе надо используется в алгоритмах сжатия, например группе LZ, arithmetic coding, Huffman. В LZ* на выходе получаются коды с разрядностью 9 и больше бит, посмотри реализацию чтения/записи.
Чет я опять запутался... Вот задача:
| 1 байт | 2 байт | = 12 битный байт (4096)
1010 1010 1010 1010 1010 1010
| 1й байт | 2й байт | 3й байт | = 8 битный байт (256)
Тоесть нужно организовать переход во 2ом байте и сдвиг в следующих битах...
Тема в архиве.