Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
#1

Поместить четыре числа от 1 до 4 в один байт - C++

18.11.2014, 11:11. Просмотров 502. Ответов 19
Метки нет (Все метки)

Здравствуйте, есть такое задание:
Есть 4 переменных типа int, каждой переменной присвоено цифра от 1 до 4.
C++
1
2
3
4
int a = 4;
int b = 2;
int c = 3;
int d = 4;
Возможно ли их "сложить" в одну сумму, но так чтоб потом можно было обратно разложить в такой же последовательности ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 11:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Поместить четыре числа от 1 до 4 в один байт (C++):

Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри другого прямоугольника
Прямоугольники. Даны положительные действительные числа a,b,c,d. Выяснить,...

Функция: изменить старший байт числа на заданное значение, не изменяя младший байт
функция изменяет старший байт числа на заданное значение не изменяя младший...

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить.
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в...

Четыре байта в один int
У меня есть char bytes = { 0xCF, 0xA1, 0x01, 0x00 }; каким образом я могу,...

Даны четыре вещественных числа от нуля. Проверить: образуют ли данные числа геометрическую прогрессию.
Даны четыре вещественных числа от нуля. Проверить: образуют ли данные числа...

Как изменить один байт в бинарном файле?
Здравствуйте. Второй день бьюсь над вопросом, просмотрел много примеров, но не...

19
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:16 #2
int sum = 125 * a + 25 * b + 5*c + d;
1
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 11:20  [ТС] #3
Dani, а как их потом разложить ?
0
HighPredator
5647 / 1964 / 716
Регистрация: 10.12.2010
Сообщений: 5,691
Записей в блоге: 3
18.11.2014, 11:35 #4
Можно в лоб так сделать:
C++
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
42
#include <iostream>
#include <cstring>
 
int compose(const int a, const int b, const int c, const int d)
{
  int returnValue = 0;
  char byteVal[sizeof(returnValue)] = {0};
  byteVal[0] = (char) a;
  byteVal[1] = (char) b;
  byteVal[2] = (char) c;
  byteVal[3] = (char) d;
  memcpy(&returnValue, &byteVal[0], sizeof(returnValue));
  return returnValue;
}
 
void decompose(const int src, int& a, int& b, int& c, int& d)
{
  char byteVal[sizeof(src)];
  memcpy(&byteVal[0], &src, sizeof(byteVal));
  a = byteVal[0];
  b = byteVal[1];
  c = byteVal[2];
  d = byteVal[3];
}
 
int main()
{
  int a = 4;
  int b = 3;
  int c = 1;
  int d = 4;
  std::cout<<"Values: a = "<<a<<", b = "<<b<<", c = "<<c<<", d = "<<d<<std::endl;
  int res = compose(a, b, c, d);
  std::cout<<"Composed value: "<<res<<std::endl;
  a = 0;
  b = 0;
  c = 0;
  d = 0;
  decompose(res, a, b, c, d);
  std::cout<<"Decomposed: a = "<<a<<", b = "<<b<<", c = "<<c<<", d = "<<d<<std::endl;
  return 0;
}
(для интов не менее 4х байт)
1
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:35 #5
int d = sum % 5;
sum /= 5;
int c = sum % 5;
sum /= 5;
inc b = sum % 5;
sum /= 5;
int a = sum;
1
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 11:40  [ТС] #6
Спасибо

Добавлено через 2 минуты
а возможно чтоб сумма была не больше 16 ?
0
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:46 #7
tdo22, можно. просто сумму, что я предложил, возьми с минусом (а потом обратно верни знак)
1
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 11:48  [ТС] #8
Dani, можно пример ? а то я что-то не очень понял как это сделать
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
18.11.2014, 11:53 #9
Можно и в один байт запаковать, но только распаковка не очень красивая:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
int main(int argc, char* argv[]) {
    int a = 4;
    int b = 2;
    int c = 3;
    int d = 1;
    char bitfield = (a & 0x03) + ((b << 2) & 0x0C) + ((c << 4) & 0x30) + ((d << 6) & 0xC0);
 
    std::cout << "a = " <<  ((bitfield & 0x03)?(bitfield & 0x03): 0x04)  << std::endl;
    std::cout << "b = " <<  (((bitfield & 0x0C) >> 2)?((bitfield & 0x0C) >> 2): 0x04) << std::endl;
    std::cout << "c = " <<  (((bitfield & 0x30) >> 4)?((bitfield & 0x30) >> 4): 0x04) << std::endl;
    std::cout << "d = " <<  (((bitfield & 0xC0) >> 6)?((bitfield & 0xC0) >> 6): 0x04) << std::endl;
 
    return 0;
}
2
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:54 #10
Лучший ответ Сообщение было отмечено tdo22 как решение

Решение

int sum = 125 * a + 25 * b + 5*c + d;
sum = -sum;
...
sum = -sum;
int d = sum % 5;
sum /= 5;
int c = sum % 5;
sum /= 5;
inc b = sum % 5;
sum /= 5;
int a = sum;
1
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 12:02  [ТС] #11
Ilot, интересной метод, спасибо
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
18.11.2014, 12:15 #12
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. Один байт это наименьший объем памяти требуемый для решения данной задачи. Ибо 4 * 4 * 4 * 4 = 256.
0
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 12:21  [ТС] #13
Ilot, ок, а какую максимальную сумму можно засунуть в один байт ?
я имею ввиду больше чем 256, пользуясь Вашим кодом ?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
18.11.2014, 12:28 #14
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. У тебя 4 числа от 1 до 4 каждое, это соответствует четырёхзначному четвертичному числу, то есть всего имеем http://www.cyberforum.ru/cgi-bin/latex.cgi?4^4 комбинаций, как ни минимизируй максимум суммы, меньше 255-ти не получишь.
0
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 12:30  [ТС] #15
taras atavin, ясно, возможно я взял не тот подход к своей задаче.
А возможно впихнут в один байт число от 0 к 70 000 ?
Знаю что глупо звучит, так как 1 байте это не более 256, но увидев код Ilot, стало интересно возможно ли такое ?
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
18.11.2014, 12:33 #16
Цитата Сообщение от tdo22 Посмотреть сообщение
А возможно впихнуть...
Нельзя объять необъятное, объяснить необъяснимое и впихнуть невпихуемое.
1
Dani
1393 / 637 / 134
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 12:37 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
суммы меньше 63-х не получишь.
Цитата Сообщение от Dani Посмотреть сообщение
можно. просто сумму, что я предложил, возьми с минусом (а потом обратно верни знак)
Хак
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
18.11.2014, 12:40 #18
Цитата Сообщение от Dani Посмотреть сообщение
суммы меньше 63-х не получишь.
Обсчитался. 255-ти

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Нельзя объять необъятное, объяснить необъяснимое и впихнуть невпихуемое.
Впихнуть можно, но только покоцав до невосстановимого состояния. В частности число до 70 000 000 отлично хешируется даже в пол байта, но с таким количеством хеш-коллизий, что лучше этим не маяться.
0
tdo22
11 / 11 / 12
Регистрация: 14.02.2013
Сообщений: 743
18.11.2014, 12:49  [ТС] #19
taras atavin, а если в байт засунуть, то реально будет его восстановить ?
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
18.11.2014, 13:05 #20
Нет. Для восстановления надо кодировать без потерь той информации, которую собираешься восстанавливать, а в байт помещается лишь информация о 256-ти комбинациях. Или речь о 4-х числах от 1 до 4-х? Тогда да.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
sum=(a-1)+(b-1)*4+(c-1)*16+(d-1)*64;
...
a=sum%4+1;
b=(sum/4)%4+1;
c=(sum/16)%4+1;
d=sum/64+1;
1
18.11.2014, 13:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2014, 13:05
Привет! Вот еще темы с решениями:

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

Чтение бинарного файла в строку: читается только один байт
Читаю бинарный файл в строку, но почему-то читает только 1 байт. Где здесь...

Как в один вектор поместить много классов?
Всем привет. Есть задумка а как сделать пока не ясно. Есть в наличии допустим...

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


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

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

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