ПрограммированиеФорумОбщее

функции для работы с битами (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
17:57, 13 июля 2009

ну есть же битовые поля в структурах:

struct X
{
  unsigned int x: 12;
};

почти что даром.

#16
18:00, 13 июля 2009

=A=L=X=
sizeof() говорит что это 4 байта.

Однако придется выгрызать биты из байта.

#17
18:23, 13 июля 2009

если нужна скорость и не сильно жалко память, то и не стоит напрягаться, храни 12 бит в 16, похожим образом в процах хранятся числа, в десятичной системе счисления, используя 4 бита (16 комбинаций) для десятичного числа (10 комбинаций). (для тех кто в танке, называется двоичнодесятичная система) а вот если гемор хочется побыстрее, то велком в увлекательный мир программирования.

#18
18:27, 13 июля 2009

my.name
Это как раз и нужно для сбережения памяти.

#19
18:28, 13 июля 2009

OberMeister
> =A=L=X=
> sizeof() говорит что это 4 байта.
потому что округлилась

struct X
{
  unsigned int x: 12;
  unsigned int y: 24;
};

так тоже будет 4 байта

#20
19:23, 13 июля 2009

Это вам не во флейме флеймить.

#21
19:29, 13 июля 2009
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];
};

Это в первом приближении. Оператор [] не будет работать на присваивание, но тут уже думай сам, мне дальше лениво расписывать.

#22
19:35, 13 июля 2009

Корован Историй
> size / 8 + 1
не так!
size / 8 + ((size % 8) ? 1 : 0)

#23
19:49, 13 июля 2009

OberMeister
> Есть идея сделать хороший формат рисунка (выгода в качестве и размере) (c) МОЁ
С потерями даных? Без? Сколько бит на компонент? Другими словами хочеться больше услышать о выгоде, потому что есть подозрение что среди уже существующих форматов возможно есть и покруче того, что ты пытаешся придумать....

#24
19:50, 13 июля 2009

Kloun
Один байт не жалко, а огород городить - сам не разберёшься потом.

#25
20:00, 13 июля 2009

Breezy
>есть подозрение что среди уже существующих форматов возможно есть и покруче того
конечно есть, просто соберу тестовую версию там уже будет видно. :)

Корован Историй
у меня впринцепи суть таже но я хотел сделать подобие fread() fwrite()
о таком варианте неподумал. Спасиб.

#26
20:00, 13 июля 2009

поправко

bool operator [](unsigned int i)
{
    return data[i >> 3] & (1 << (i&7));
}

правка: а хотя нет, не так, нда пох...

#27
20:16, 13 июля 2009

Корован Историй
> Один байт не жалко, а огород городить - сам не разберёшься потом.
как было указано выше - цель экономия памяти.
да и плюс  еще выравнивание - если мы используем 32 бита, то получаем в итоге 5 байт - если выравниваем структуру то теряем уже не 1 а 4 байта

#28
20:46, 13 июля 2009

OberMeister
Похоже то, что тебе надо используется в алгоритмах сжатия, например группе LZ, arithmetic coding, Huffman. В LZ* на выходе получаются коды с разрядностью 9 и больше бит, посмотри реализацию чтения/записи.

#29
20:53, 13 июля 2009

Чет я опять запутался... Вот задача:

|      1 байт        |      2 байт        |  = 12 битный байт (4096)
1010 1010 1010 1010 1010 1010
| 1й байт  |  2й байт  | 3й байт  |  = 8 битный байт (256)


Тоесть нужно организовать переход во 2ом байте и сдвиг в следующих битах...

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.