Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть такое задание:
Есть 4 переменных типа int, каждой переменной присвоено цифра от 1 до 4.
C++
1
2
3
4
int a = 4;
int b = 2;
int c = 3;
int d = 4;
Возможно ли их "сложить" в одну сумму, но так чтоб потом можно было обратно разложить в такой же последовательности ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2014, 11:11
Ответы с готовыми решениями:

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

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

Поместить в массив данные размером 16 байт
создаю массив заданного размера 256кб (или 262144 байт), заполненный нулями byte bytes = new...

Поместить 2 байта в стэк vs jmp в 8 байт
Доброго дня, друзья) Прошу вашей помощи в решении очередной задачи. Я недавно развивал тему, как...

19
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.11.2014, 11:16 2
int sum = 125 * a + 25 * b + 5*c + d;
1
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 11:20  [ТС] 3
Dani, а как их потом разложить ?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 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
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
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
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 11:40  [ТС] 6
Спасибо

Добавлено через 2 минуты
а возможно чтоб сумма была не больше 16 ?
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.11.2014, 11:46 7
tdo22, можно. просто сумму, что я предложил, возьми с минусом (а потом обратно верни знак)
1
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 11:48  [ТС] 8
Dani, можно пример ? а то я что-то не очень понял как это сделать
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
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
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
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
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 12:02  [ТС] 11
Ilot, интересной метод, спасибо
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.11.2014, 12:15 12
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. Один байт это наименьший объем памяти требуемый для решения данной задачи. Ибо 4 * 4 * 4 * 4 = 256.
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 12:21  [ТС] 13
Ilot, ок, а какую максимальную сумму можно засунуть в один байт ?
я имею ввиду больше чем 256, пользуясь Вашим кодом ?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.11.2014, 12:28 14
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. У тебя 4 числа от 1 до 4 каждое, это соответствует четырёхзначному четвертичному числу, то есть всего имеем https://www.cyberforum.ru/cgi-bin/latex.cgi?4^4 комбинаций, как ни минимизируй максимум суммы, меньше 255-ти не получишь.
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 12:30  [ТС] 15
taras atavin, ясно, возможно я взял не тот подход к своей задаче.
А возможно впихнут в один байт число от 0 к 70 000 ?
Знаю что глупо звучит, так как 1 байте это не более 256, но увидев код Ilot, стало интересно возможно ли такое ?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.11.2014, 12:33 16
Цитата Сообщение от tdo22 Посмотреть сообщение
А возможно впихнуть...
Нельзя объять необъятное, объяснить необъяснимое и впихнуть невпихуемое.
1
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
18.11.2014, 12:37 17
Цитата Сообщение от taras atavin Посмотреть сообщение
суммы меньше 63-х не получишь.
Цитата Сообщение от Dani Посмотреть сообщение
можно. просто сумму, что я предложил, возьми с минусом (а потом обратно верни знак)
Хак
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
18.11.2014, 12:40 18
Цитата Сообщение от Dani Посмотреть сообщение
суммы меньше 63-х не получишь.
Обсчитался. 255-ти

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Нельзя объять необъятное, объяснить необъяснимое и впихнуть невпихуемое.
Впихнуть можно, но только покоцав до невосстановимого состояния. В частности число до 70 000 000 отлично хешируется даже в пол байта, но с таким количеством хеш-коллизий, что лучше этим не маяться.
0
14 / 14 / 13
Регистрация: 14.02.2013
Сообщений: 787
18.11.2014, 12:49  [ТС] 19
taras atavin, а если в байт засунуть, то реально будет его восстановить ?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2014, 13:05
Помогаю со студенческими работами здесь

Получить значения каждого из четырех байт (тип Byte), составляющих эти четыре поля записи
Задана запись с вариантами, имеющая четыре поля символьного типа (тип Char) каждое. Получить...

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

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

Объединить четыре ик-пульта в один
Всем доброго времени суток. Для программирования топливораздаточных колонок мы используем 4 разных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru