Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
#1

Запомнить последовательность чисел в объекте целого типа - C++

26.09.2013, 19:58. Просмотров 423. Ответов 9
Метки нет (Все метки)

Такой вопрос.
У меня есть последовательность чисел. Необходимо закодировать ее в один объект целого типа (на бинарном уровне), а после, при необходимости, ее от туда извлечь. Как это сделать? (интересует только бинарный способ).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2013, 19:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Запомнить последовательность чисел в объекте целого типа (C++):

Ввести массив, состоящий из 9 элементов (девять двузначных чисел) целого типа - C++
Ввести массив, состоящий из 9 элементов (девять двузначных чисел) целого типа. Получить новый массив, состоящий из сумм цифр элементов ...

Описать функцию SumRange(A, B) целого типа, находящую сумму всех целых чисел от A до B - C++
Описать функцию SumRange(A, B) целого типа, находящую сумму всех целых чисел от A до B включительно (A и B — целые). Если A > B, то функция...

Описать функцию DigitN(K, N) целого типа, возвращающую N-ю цифру целого положительного числа K - C++
Помогите выполнить задание. Описать функцию DigitN(K, N) целого типа, возвращающую N-ю цифру целого положительного числа K (цифры в...

Последовательность целых чисел типа ShortInt - C++
Пусть имеется последовательность целых чисел типа ShortInt. Числа могут быть положительными или отрицательными. Они находятся в ...

Описать функцию NOD2(A,B) целого типа,находящую наибольший общий делитель(НОД) двух целых положительных чисел А и В,используя алгоритм Евклида:.... - C++
Описать функцию NOD2(A,B) целого типа,находящую наибольший общий делитель(НОД) двух целых положительных чисел А и В,используя алгоритм...

После ввода с клавиатуры произвольного одномерного массива целых чисел (объекта данного класса),в пределах целого типа вывести в два столбика положите - C++
Здравствуйте.помогите пожалуйста...вот такая задачка. После ввода с клавиатуры произвольного одномерного массива целых чисел (объекта...

9
zss
Модератор
Эксперт С++
6536 / 6098 / 2008
Регистрация: 18.12.2011
Сообщений: 15,862
Завершенные тесты: 1
26.09.2013, 21:45 #2
Определитесь с тем, сколько бит занимает каждое число.
Далее сдвигайте очередное число на нужное к-во бит
и записывайте в результат с помощью побитового или ( | ).
Второй вариант - использовать возможность указывания
количества бит в структуре
C++
1
2
3
4
struct pack
{
   long int a1:4[16];
};
Добавлено через 1 час 34 минуты
К сожалению, "Нельзя организовывать массивы битовых полей".
Придется расписать все поля отдельно.
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
29.09.2013, 14:57  [ТС] #3
Интерисует первый вариант.
Привидите пример (запихнуть последовательность чисел и извлечь их), а я вам за это плюсик.
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
29.09.2013, 15:21 #4
Я так понимаю, Вам нужна архивация, потому как именно она занимается подобного рода вещами. Закодировать в 32 бита, можно не так много чисел.

Известный предел архиваторов - 1.5 бита на символ char. На другой int, следовательно, 4*1.5 - 6 бит. Так что при самом лучшем стечении звезд, мирового хаоса и лучших алгоритмах кодирования, Вы в среднем сможете засунуть в int не более 5 интов.

Больше вариантов то и нет. В первом и во втором предложенном примере невозможно будет восстановить последовательность имея только этот несчастный объект. Нужна дополнительная информация о положении.

Добавлено через 7 минут
Эффективный алгоритм кодирования: RLE->BWT->RLE->MTF->ARI
RLE - Кодирование повторений (run lengt encoding)
BWT - Преобразование Барроуза Уиллера
MTF - Алгоритм Книжной полки (move to front)
ARI - Арифметическое кодирование

Такая последовательность даст эффективность на уровне gzip (в некоторых случая даже круче, проверял лично)
1
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
29.09.2013, 15:24  [ТС] #5
Задача следующего характера.
(массивы использовать запрещено)
Ввести определенное число целых, сохранить их в одном объекте. И после вытолкнуть их оттуда.
Я сделал так:

C++
1
2
3
4
int val1 = 0;
 
цикл...
val1 = val1 * 10 + вводимое число;
и извлек:
C++
1
2
for(; val1 > 0; val1 /= 10)
cout<<(val1 % 10)<<" ";
Проблема такого подхода - возможность сохранения только одноцифровых чисел. Понятно, что для двухцифровых делаем то же самое только делитель ставим равным 100. Но чем больше делитель тем быстрее происходит переполнение.

И тут меня натолкнули на мысль, что проблему можно решить на бинарном уровне.
Сомневаюсь, что только алгоритмами архивации. Может есть что-то еще?

Добавлено через 1 минуту
Но в любом случае архивацию рассмотрю
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
29.09.2013, 15:34 #6
Этот объект int? long long? есть знак у входных чисел? А то я могу использовать неявные объекты-массивы, например map или string.

Ваш пример некорректный, если я введу 1 и -1 то получу 9.
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
29.09.2013, 15:36  [ТС] #7
работат только с положительными
это объект int
знака у входных нет
массивы использовать нельзя
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
29.09.2013, 15:45 #8
Поздравляю, поместить в int последовательность других int из более чем 32-х штук - невозможно. Исключительно по той причине, что нижний предел Энтропии информации равен 1 биту. Бит не раздробишь, иначе информация будет зависимой (шанс следующего вводимого числа будет зависеть от шансов предыдущих введенных).
Так можете и написать в своем ответе к заданию. Странно, кто Вам задал такое задание? Это или уловка, или человек чего-то не понимает.

Или второй вариант - вы что-то недоговариваете.
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
29.09.2013, 15:49  [ТС] #9
Заданию уже давно здал. Препод принял первый вариант, и как раз ляпнул про бинарный уровень, вот я и рыскаю
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
29.09.2013, 16:03 #10
Ну в общем-то Вам сказаны все способы. Ваш способ слишком быстро приведет к переполнению или будет слишком сильно ограничивать диапазон элемента последовательности, так что - архивация. Ваш вопрос из разряда фундаментальных, если бы был способ лучше, то мы бы передавали фильмы одним или двумя интами и никому нафиг не нужны были бы соединения в несколько Мб, флешки и прочие технологии ))
0
29.09.2013, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 16:03
Привет! Вот еще темы с ответами:

[Метапрограммирование] Определить наличие поля определенного типа в объекте переданном в шаблон - C++
Здравствуйте форумчане. Необходимо в шаблоне определить наличие поля определенного типа у объекта, который был передан в шаблон. Два...

Реализовать функции обращающие порядок следования элементов в объекте типа vector<int> - C++
Писал код,но никак не удавалось проделать механизм изменяющий порядок следования чисел в векторе.И как воспользоваться функцией...

Измените структуру CStash чтобы данные хранились в объекте типа vector<char> - C++
Измените структуру CStash чтобы данные хранились в объекте типа vector&lt;char&gt; //hello.h struct CStash{ int size; int quantity; ...

Определите объединения, элементами которого являются массивы из трех чисел типа long и с шести чисел типа int - C++
Определите объединения, элементами которого являются массивы из трех чисел типа long и с шести чисел типа int. Значение элементов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru