powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Фильрованная битовая упаковка и распаковка на плюсах
51 сообщений из 51, показаны все 3 страниц
Фильрованная битовая упаковка и распаковка на плюсах
    #38354495
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая задачка: в пространстве символов
Код: plaintext
1.
a,b,c,...,x,y,z


закодировать строку (массив) из такого пространства символов
Код: plaintext
1.
2.
3.
4.
5.
6.
a,b,c,...,x,y,z
A,B,C,....,X,Y,Z
0,1,...,9
а,б,в,...,э,ю,я
А,Б,В,...,Э,Ю,Я
!,",#,$,%,&,',(,),*,+,,,—,.,/,:,;,<,=,>,?,[,\,],^,_,{,|,},@,~,–,—,&#8213;



я знаю как решается эта задача (наитупейший маппинг в цикле), если мы сделаем такое допущение: на один символ из пространства-отправителя приходится два символа из пространства получателя, например ё == cb, ж == cf и т.д.

В этом случае outBuf.strlen() = initBuf.strlen() * 2

у нас целевое пространство 26 символов
исходное пространство 26 * 2 + 33 * 2 + 10 + 34 = 162 символа
парные комбинации из 26^2 = 676 / 162 = 4
значит существует возможность обеспечить

outBuf.strlen() = initBuf.strlen() * ( 1 + 1 / 4 )

- - - - - - -

Задача в следующем: произвести битовую упаковку, но только так, чтобы результат состоял только из символов пространства получателя, т.е. из а-z

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

Если можно подскажите как происходит запись и чтение
я видел конструкции типа currentCharacter << 6 но у меня реально крышняк сносит чтобы не наделать ошибок, когда битовые комплекты одного символа голова в одном символе, а хвост в другом
Ладно ещё когда можно использовать все битовое пространство, но в этой задаче можно использовать только битовое пространство соответствующее символам a-z (десятичные ascii коды 141 - 172, битовое с 01100001 - 01111001)

и ещё забыл одно условие назвать: алгоритму должно быть пофиг в какой кодировке поставляется буфер с символами отправителями

Код: plaintext
1.
2.
3.
verystr out;
print(out.pack("Всем привет! Как дела? :))")); // некая абракадабра состоящая только из a-z
print(out.pack("Всем привет! Как дела? :))").unpack()); // выводится исходная строка
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354502
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixалгоритму должно быть пофиг в какой кодировке поставляется буфер с символами отправителями
как это пофиг?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354510
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixмне всегда туго давались битовые операции на плюсах
Ну и забей. Бери входной буфер как очень длинное целое число и переводи его в
двадцатишестиричную систему как и любое другое число - делением с остатком. Делить-то ты,
надеюсь, умеешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354553
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLumixалгоритму должно быть пофиг в какой кодировке поставляется буфер с символами отправителями
как это пофиг?

Это означает, что нам должно быть пофиг какому числу соответствует символ, который мы ходим перевести. Например символу У в зависимости от разных кодировок будет соответствовать разные цифровые коды. Так вот в нашем алгоритме это пофиг. Мы исходим из того, что нашему коду уже поставляется готовый символ.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354554
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovБери входной буфер как очень длинное целое число и переводи его в
двадцатишестиричную систему как и любое другое число - делением с остатком.

Мозгов не хватает перевести эту рекомендацию в код. Может кто-нибудь поможет?

Dimitry SibiryakovДелить-то ты,
надеюсь, умеешь?..


Вот эту операцию знаю, если речь о ней.

Код: plaintext
1.
std::cout << 9 % 4; // => 1
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354562
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixМожет кто-нибудь поможет?
У ближайшей школы отлови какого-нибудь первоклашку, их как раз этому учат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354582
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixИзопропилпропущено...

как это пофиг?

Это означает, что нам должно быть пофиг какому числу соответствует символ, который мы ходим перевести. Например символу У в зависимости от разных кодировок будет соответствовать разные цифровые коды. Так вот в нашем алгоритме это пофиг. Мы исходим из того, что нашему коду уже поставляется готовый символ.
Развитие этой идеи уходит к исследованиям Клода Шеннона. Для твоей-же задачи
достаточно представить что ты программируешь телеграфный аппарат типа Т-63.
Он передавал 5-битным кодом все символы русского алфавита, латиницы и цифр.
Разумеестя у него были управляющие сигналы (controls) которые меняли регистр
передачи. Для твоей машины нужно обязать самый редко-используемый символ
(например 'q') сделать управлящим. Если приходит управляющий - то следующий
за ним - является командой смены алвавита. Если управляющий задваивается
'qq' то это значит просто символ 'q'.

Ну это так. По простому. По серъёзному надо анализировать частоты поли-алвавитного
текста и вводить длинные цепочки символов алфавита A={a..z} для редких символов
поли-алвавитного текста и наоборот. Дальше начинаются алгоритмы Хаффмена и LZW
и простая телегарфия заканчивается. Начинаются архиваторы.

И ты не ставь себе задачу архивации. Это тема долгая и нудная. А просто сделай переключение
между регистрами и всё.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354590
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixМы исходим из того, что нашему коду уже поставляется готовый символ.
это значит перекодирование из исходной в свою (0.. 161) уже произведено. не говори "пофиг"
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354744
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLumixМы исходим из того, что нашему коду уже поставляется готовый символ.
это значит перекодирование из исходной в свою (0.. 161) уже произведено. не говори "пофиг"

Да, все верно: можно считать, что стоит задача упаковать последовательность чисел из диапазона 0 - 161

Код: plaintext
1.
2.
intlist conv(str buf);
conv("Привет") // 112, 79, 72, 64, 67, 81



Вот по такой схеме

Код: plaintext
1.
2.
3.
4.
5.
6.
a,b,c,...,x,y,z // 0 -25 
A,B,C,....,X,Y,Z // 26 - 51
0,1,...,9 // 52 - 61
а,б,в,...,э,ю,я // 62 - 94
А,Б,В,...,Э,Ю,Я // 95 - 127
!,",#,$,%,&,',(,),*,+,,,—,.,/,:,;,<,=,>,?,[,\,],^,_,{,|,},@,~,–,— // 128 - 161



При этом упаковка происходит в бинарную форму, а не в символьную.

Рабочая гипотеза решения такая:
1) бинарное пространство дает чанки степени двойки, т.е. "вагончиками" могут быть только 1, 11, 111, 1111, 11111, ... т.е. "корзины" емкостью 2, 4, 8, 16, 32, 64, 128, 256, ...
2) если у нас 161 символ, то минимальный вагончик для нашей задачи 256 == 8 бит
3) количество символов получателей 26, значит для них минимальный вагончик 32 == 5 бит

Код: plaintext
1.
2.
xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx
yyyyy yyyzz zzzzz zyyyy yyyyz zzzzz zz...



4) пространство, в которое мы хотим складывать это диапазон ascii адресов 97 - 122, но этот диапазон может быть представлен как 97 + (0 - 25)

на этих тезисах получается такой алгоритм
1) конвертим строку в собственную 8-битную кодировку, где занятыми будут первые 162 символа
2) в новом цикле берем каждый символ (число) и конвертим его в бинарную форму и складываем в бинарный буфер (битовый массив)
3) в новом цикле считаываем из полученного бинарного буфера чанки по 5 бит, конвертим в десятичное число, прибавляем к этому числу 97, конвертим в символ ascii и складываем в строковый буфер

раскодировка
1) в цикле читаем из буфера символ, конвертим его десятичное число, вычитаем 97, конвертим в 5 битный бинарник и складываем в бинарный буфер
2) в новом цикле читаем чанки по 8 бит, конвертим в десятичное число, преобразуем из своей 8 битовой кодировки в исходную строковую кодировку и складываем в строковый буфер

Вопросы:
1) насколько это алгоритм взрослый?
2) как такое мутится средствами плюсов? где тут используется операция деления с остатком?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354748
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ ты не ставь себе задачу архивации. Это тема долгая и нудная. А просто сделай переключение
между регистрами и всё.

Эта задача не про архивацию, а про упаковку без архивации. Это задача про конвертацию.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354767
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

Посмотри как устроена кодировка Base64
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354769
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixmaytonИ ты не ставь себе задачу архивации. Это тема долгая и нудная. А просто сделай переключение
между регистрами и всё.

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

Зачем?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354770
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Lumix3) в новом цикле считаываем из полученного бинарного буфера чанки по 5 бит, конвертим в десятичное число, прибавляем к этому числу 97, конвертим в символ ascii и складываем в строковый буфер
В 5 битах может оказаться 31, 97+31=128 - упс, не попали в диапазон латинских букв...
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354886
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix
Дело в том, что мне всегда туго давались битовые операции на плюсах и максимум на что меня хватало это на организацию флаговой системы и то я постоянно путаю операции, какие из них сбрасывают, какие проверяют...



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
unsigned char s = 0xaa;
unsigned char r = 0;
unsigned char bit_no = 0;

r = ( s & ( 0x01 << bit_no ) ) >> bit_no; // выделение бита с номером bit_no (в r 0 или 1), обратный сдвиг можно не делать, тогда будет результат 0 или не 0.
s = s | ( 0x01 << bit_no ); // установка бита с номером bit_no в s.
s = s & ~( 0x01 << bit_no ); // сброс бита с номером bit_no в s.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354890
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЛадно ещё когда можно использовать все битовое пространство, но в этой задаче можно использовать только битовое пространство соответствующее символам a-z (десятичные ascii коды 141 - 172, битовое с 01100001 - 01111001)

Я не понял, нафига тебе тут для этой задачи вообще нужны операции с битами.

автори ещё забыл одно условие назвать: алгоритму должно быть пофиг в какой кодировке поставляется буфер с символами отправителями


Это невозможно.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354893
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovLumixмне всегда туго давались битовые операции на плюсах
Ну и забей. Бери входной буфер как очень длинное целое число и переводи его в
двадцатишестиричную систему как и любое другое число - делением с остатком. Делить-то ты,
надеюсь, умеешь?..



Зачем ?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354895
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixИзопропилпропущено...

как это пофиг?

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

Глупый, символ -- это и есть число. Там нет никакого соответствия, именно по значению числа ты и понимаешь, какой это символ.
И это соответствие называется кодировкой.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354897
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumixи ещё забыл одно условие назвать: алгоритму должно быть пофиг в какой кодировке поставляется буфер с символами отправителями

Код: plaintext
1.
2.
3.
verystr out;
print(out.pack("Всем привет! Как дела? :))")); // некая абракадабра состоящая только из a-z
print(out.pack("Всем привет! Как дела? :))").unpack()); // выводится исходная строка




На самом деле я что-то ступил по жаре, тут же достаточно чтобы кодирование/декодирование было бы обратимым, тогда если абракадабра будет на входе, на выходе декодирования будет та же абракадабра.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38354909
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDimitry Sibiryakovпропущено...

Ну и забей. Бери входной буфер как очень длинное целое число и переводи его в
двадцатишестиричную систему как и любое другое число - делением с остатком. Делить-то ты,
надеюсь, умеешь?..



Зачем ?
Потом что исходное и конечное основание - не степень двойки, и множества не отображаются без дыр - без явного деления не обойтись.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355001
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, нафига это всё?
Там всё просто, надо для каждый входной символ закодировать как (естественно) два символа из целевого алфавита.

Что там он хочет битово закодировать -- не понятно совсем, это его фантазии.
Пусть тогда излагает.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я про это и говорю. Кто его вообще просит делат экономию на спичках?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355016
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
unsigned char s = 0xaa;
unsigned char r = 0;
unsigned char bit_no = 0;

r = ( s & ( 0x01 << bit_no ) ) >> bit_no; // выделение бита с номером bit_no (в r 0 или 1), обратный сдвиг можно не делать, тогда будет результат 0 или не 0.
s = s | ( 0x01 << bit_no ); // установка бита с номером bit_no в s.
s = s & ~( 0x01 << bit_no ); // сброс бита с номером bit_no в s.



Я эти операции знаю, но мне не хватает мозгов как ими читать и писать чанки

Код: plaintext
1.
2.
(8 бит = 001100001) == (5 бит = 100001) == (ascii ode = 97) == (ascii letter = a)
(8 бит = 001111010) == (5 бит = 111010) == (ascii code = 122) == (ascii letter = z)



Битовый массив как я понял из примера выше задается вот так

Код: plaintext
1.
unsigned char bitbuf[4096]; // адресное пространство 4096 * 8 = 32768



Буква z из нашей кастомной кодировки 0-161, которую мы ввели специально для целей данной темы соответствует десятичному коду 25, что в 8 битах означает 00011001

Вопрос первый как имея на руках десятичное число 25 записать в bitbuf скажем в 315 позицию (битовый адрес которой 315 * 8 = 2520)

В принципе ответ очевиден

Код: plaintext
1.
bifbuf[315] = 25;



Но при этом мы не использовали битовую адресацию. А как можно выполнить ту же самую операцию, но использовать именно битовую запись, указав при этом длину чанка 8 бит?

Код: plaintext
1.
2.
uchar chunk = 25;
bufbuf.write(315 * 8, chunk, 8); // write(int bitAddress, uchar chuck, int takeNFirstBitsFromTheEndOfChunk);



- - - - - - -

Теперь имея в битбуфе чанки по 8 бит, наша задача в цикле брать порциями по 5 бит, добавлять к ним 97 и складывать полученное число в строковый буфер, рассчитывая при этом получать только ascii буквы a-z

Код: plaintext
1.
butbuf.read(315 * 8, 5); // read(int bitAddress, int numberOfBitsToRead);



Как эта функция на плюсах выполняется? Тоже каким-то хитрым битовым шифтом?

- - - - - - -

Ещё возникает вопрос, поскольку сумма 8 битовых чанков не равняется сумме 5 битовых чанков (ну разве что при Summ = 40 как минимальный общий знаменатель), то возникает вопрос, как в цикле читая 5 битовые чанки мы сможем определить окончание и что нам делать в этом случае? Просто доращивать битбуф нулями, чтобы он делился на 5 без остатка?

- - - - - - - - -

возможно если будут ответы на эти вопросы, тогда вопросы по написания обратной процедуры (расширование) исчезнут сами.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355026
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧто там он хочет битово закодировать -- не понятно совсем
понятно всё, но программировать никто не хочет
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355041
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLumix,

Посмотри как устроена кодировка Base64

http://base64.sourceforge.net/b64.c

Смотрю в книгу вижу фигу.
Не могу найти в этом коде кусок который показывает как читаются и пишутся битовые чанки заданной длины
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355045
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivЧто там он хочет битово закодировать -- не понятно совсем
понятно всё, но программировать никто не хочет
Никто не хочет доказывать что море солёное или солнце восходит в одном и том-же месте
такой высокой ценой. Енкодер битовых цепочек или бит-последовательностей есть
в любом архиваторе. Можно взять его исходники и посмотреть. Думаю там ничего
интересного нет. Ниакой научной идеи тоже нет. Тривиальные побитовые операции
и куча скушных проверок.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355050
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivЧто там он хочет битово закодировать -- не понятно совсем
понятно всё, но программировать никто не хочет

Я же не прошу кодировать за меня.
Я прошу показать только как кодируются самые узкие места.
А если конкретно то на данный момент меня интересует битовые чтение и запись чанков произвольной длины и по произвольным адресам.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355054
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТривиальные побитовые операции
и куча скушных проверок.

То есть мне что придется вручную делением с остатком пилить каждое число на биты, а потом каждый бит записывать по заданному адресу? Так что ли?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355062
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилMasterZivЧто там он хочет битово закодировать -- не понятно совсем
понятно всё, но программировать никто не хочет

Ну, мне не понятно. Объясни.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355065
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixИзопропилLumix,

Посмотри как устроена кодировка Base64

http://base64.sourceforge.net/b64.c

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

Я тебе привёл кусочки кода для установок битов.
Из них можно легко сделать нужные функции. В цикле нужные битики из последовательности проставлять.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355079
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixmaytonТривиальные побитовые операции
и куча скушных проверок.

То есть мне что придется вручную делением с остатком пилить каждое число на биты, а потом каждый бит записывать по заданному адресу? Так что ли?
Тебе нужна своя имплементация следующего (примерно). Ну... если-бы я-был тобой- ябы шкодил
следующий манки-код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
lumix::Base26FuckenStream fuckenStream = new lumix::Base26FuckenStream(new FuckenMemoryStream());

fuckenStream.addChar('L');
fuckenStream.addString("umix");
fuckenStream.addBit(1);
fuckenStream.addWord(0xFFFF);
fuckenStream.addDWORD(0xFFFFFFFF);

fuckenStream.close();

...

lumux::Base24FuckenDecoder.... e.t.c.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355128
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ тебе привёл кусочки кода для установок битов.
Из них можно легко сделать нужные функции. В цикле нужные битики из последовательности проставлять.

В цикле битики проставлять. Это конечно жесть... Высокоуровневый язык, блин... Я так-то в шоке, что в плюсах не оказалось банального битстрима с произвольной адресацией!!

Это ж надо в цикле каждое десятичное число делить на 2, чтобы получить состояние бита, а потом надо складывать каждый битик с помощью сдвига в чанку, а потом эту чанку надо сдвигом же накладывать на битбуфер, а если ещё эта чанка попадает на границу чаров, то эту операцию придется разбить на две части.... Я в шоке дорогая редакция...

Чтобы прочитать кусок в середине чара, нужно обнулить границы, а потом сдвинуть кусок к началу чара, если это начало чанка и к началу чара, если это конец чанка.... Епрст, короче...

maytonТебе нужна своя имплементация следующего (примерно). Ну... если-бы я-был тобой- ябы шкодил
следующий манки-код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
lumix::Base26FuckenStream fuckenStream = new lumix::Base26FuckenStream(new FuckenMemoryStream());

fuckenStream.addChar('L');
fuckenStream.addString("umix");
fuckenStream.addBit(1);
fuckenStream.addWord(0xFFFF);
fuckenStream.addDWORD(0xFFFFFFFF);

fuckenStream.close();

...

lumux::Base24FuckenDecoder.... e.t.c.



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

Код: plaintext
1.
str b26packer(str buf, bool encode = true);
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355149
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Широкая культрура брадт... Я тебе скреативил мега-интерфейс. Его потом можно будет
в других задачах юзать. А твоя хфункция - "чугунный лапоть" есть. И посему быть ей брошеной
за околицу яко мусор непотребный. А мой код - зело красен и людям дорог есть.

Вот так вот, православные. Вот так.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355202
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВ цикле битики проставлять. Это конечно жесть... Высокоуровневый язык, блин... Я так-то в шоке, что в плюсах не оказалось банального битстрима с произвольной адресацией!!


Я не понял... тебе не нравится ?
Иди тогда ищи компоненту нужную в VB или Delphi.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355204
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixВ цикле битики проставлять. Это конечно жесть... Высокоуровневый язык, блин... Я так-то в шоке, что в плюсах не оказалось банального битстрима с произвольной адресацией!!
Вообще-то он есть - называется vector<bool> :)
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355851
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivLumixВ цикле битики проставлять. Это конечно жесть... Высокоуровневый язык, блин... Я так-то в шоке, что в плюсах не оказалось банального битстрима с произвольной адресацией!!


Я не понял... тебе не нравится ?
Иди тогда ищи компоненту нужную в VB или Delphi.

Ну не то, чтобы не нравится... Просто типа увидел девочку с которой познакомился на дискотеке без косметики с помятыми волосами
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355853
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyLumixВ цикле битики проставлять. Это конечно жесть... Высокоуровневый язык, блин... Я так-то в шоке, что в плюсах не оказалось банального битстрима с произвольной адресацией!!
Вообще-то он есть - называется vector<bool> :)

Это шутка или реальность? Я где-то читал, что булы на плюсах это просто шорты.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355859
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЭто шутка или реальность? Я где-то читал, что булы на плюсах это просто шорты.
- ну и гавно ваш Карузо!
-ты его слышал?
-нет, мне Рабинович напел
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355864
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixAnatoly Moskovskyпропущено...

Вообще-то он есть - называется vector<bool> :)

Это шутка или реальность? Я где-то читал, что булы на плюсах это просто шорты.

Алёна Сагалаева
тебе уже стучится вкотактик. Она хочет рассказать как реализован
булевый вектор. На этот раз она будет в косметике
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355865
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixЭто шутка или реальность? Я где-то читал, что булы на плюсах это просто шорты.
vector<bool> - не шутка, это массив битов. Именно vector + bool. Во всех остальных случаях bool это 1 байт.
В новом стандарте 11 есть отдельный контейнер для битов (не помню название, легко нагуглите).
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355868
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОна хочет рассказать как реализован булевый вектор.
Ну, человек хотел "высокоуровневый" битовый контейнер - получил :)
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355870
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другое дело что он ему нафик не нужен, как выше было указано :)
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355913
Фотография Новый Год
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А = russianbolshayaa
Б = russianbolshayabe

и так далее

нума если серьезно, нужно посмотреть как utf-8 символы колирует, и сделать примерно так же
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355915
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

на какие потери готовы пойти?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355943
Фотография Lumix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLumix,

на какие потери готовы пойти?

Не понял вопрос.

- - - - - - - - - - - - - - -

Короче, задача решена, требуемая функция написана и отправлена в продакшн для использования.

Я знаю многие наверное будут меня ругать за принятое и реализованное решение, но в итоге я стал проводить "битовую" конвертацию тупо через строку. Число конвертим в строку с ноликами и единичками и тупо конкатим. Потом в цикле из этой строки вырезаем подстроки требуемой длины и конвертим в число. Обратно точно так же через строку. Все получилось дешево и сердито.

Вот посылаю в форум комплект из двух перегруженных функций на основе которых удалось замутить весь остальной алгоритм.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
string bindec(unsigned int x)
{
    string out;
    do out.push_back( '0' + (x & 1) ); while (x >>= 1);
    reverse(out.begin(), out.end() );
    return out;
}

unsigned int bindec(string buf)
{
    unsigned int out = 0;
    for (int i = 0; i < buf.size(); ++i)
        out = out * 2 + (buf[i] == '1' ? 1 : 0);
    return out;
}



Из ошибок, которые были допущенные в моих рассуждениях выше такая:

если у нас 26 символов в пространстве получателя, а вагончики могут быть только кратные степени двойки 2, 4, 16, 32, 64, ..., то из этого следует не что минимальный вагончик будет 32, а следует, что минимальный вагончик будет 16, т.е. 4 бита. А поскольку у нас исходное пространство 162 укладывается в минимальный вагончик 256, т.е. 8 бит, то у нас получается в два раза больше символов, чем в исходнике, а это значит, что вариант решения с битовой упаковкой никакого выигрыша в результирующем объеме не дает по сравнению с тупой таблицей замен.

Единственная экономия которая тут возможна это на количестве используемых букв. То есть если у нас 162 буквы в исходнике, а в получателе у нас на каждую букву будет две буквы из пространства получателя, то это значит, что для дуо-кодирования мы можем использовать всего 13 букв, потому что 13^2 = 169, т.е. для кодирования нашего пространства можно использовать всего лишь диапазон a-n, что является ровно половиной от букв латинского алфавита, ибо всего их 26.

Данное свойство открывает новые возможности, которым я надеюсь будет найдено применение в наших продуктах.
Спасибо всем, кто проявил участие в этой теме.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38355954
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЯ тебе привёл кусочки кода для установок битов.
Из них можно легко сделать нужные функции. В цикле нужные битики из последовательности проставлять.можно без циклов
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <cstring>

using namespace std;

const unsigned long MASK = (1 << 6) - 1; //работаем с числами по 6 бит
//======================================================================
inline void set_bits(unsigned short * mas, unsigned long index, unsigned long input_value, unsigned long input_mask = MASK)
{
    *((unsigned long *)(mas+index/16)) &= ~(input_mask<<(index&15));
    *((unsigned long *)(mas+index/16)) |= input_value<<(index&15);
}
//======================================================================
int main()
{
    char buffer1[9];
    char buffer2[9];
    char buffer3[9];
    char buffer4[9];

    unsigned char bits[255];
    memset(bits,0,sizeof(bits));

    unsigned long num=63;
    cout<<setw(6)<<"index"<<" "<<setw(8)<<"bits[3]"<<" "<<setw(8)<<"bits[2]"<<" "<<setw(8)<<"bits[1]"<<" "<<setw(8)<<"bits[0]"<<endl;
    for(int i=0;i<32;i++)
    {
        memset(bits,0,4);
        set_bits((unsigned short *)bits, i, num);

        itoa (bits[0],buffer1,2);
        itoa (bits[1],buffer2,2);
        itoa (bits[2],buffer3,2);
        itoa (bits[3],buffer4,2);
        cout<<setfill('0')<<setw(6)<<i<<" "<<setw(8)<<buffer4<<" "<<setw(8)<<buffer3<<" "<<setw(8)<<buffer2<<" "<<setw(8)<<buffer1<<endl;
    }

    return 0;
}

...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356050
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
LumixИз ошибок, которые были допущенные в моих рассуждениях выше такая:

если у нас 26 символов в пространстве получателя, а вагончики могут быть только кратные степени двойки 2, 4, 16, 32, 64, ..., то из этого следует не что минимальный вагончик будет 32, а следует, что минимальный вагончик будет 16, т.е. 4 бита. А поскольку у нас исходное пространство 162 укладывается в минимальный вагончик 256, т.е. 8 бит, то у нас получается в два раза больше символов, чем в исходнике, а это значит, что вариант решения с битовой упаковкой никакого выигрыша в результирующем объеме не дает по сравнению с тупой таблицей замен.
Дык, не побитно надо делать. Можно например 162^7=2928229434235008 уложить в 26^11=3670344486987776. То есть например 7 исходных символов укладываем в int64, а потом раскладываем на 11 латинских букв.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356095
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LumixAnatoly Moskovskyпропущено...

Вообще-то он есть - называется vector<bool> :)

Это шутка или реальность? Я где-то читал, что булы на плюсах это просто шорты.

Это не так.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356097
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lumix,

Данное свойство открывает новые возможности, которым я надеюсь будет найдено применение в наших продуктах.

Интересно, что ж за продукты такие.
"лабораторная работа №2", следующая версия "лабораторная работа №3"
:-)
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356100
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, удивительный человек.
Вагончики, упаковка... Что хотел вообще?
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356441
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изучает битовые операции ИМХО.
...
Рейтинг: 0 / 0
Фильрованная битовая упаковка и распаковка на плюсах
    #38356969
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВообще, удивительный человек"Удивительный" - не то слово.
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Фильрованная битовая упаковка и распаковка на плюсах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]