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

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

Войти
Регистрация
Восстановить пароль
 
 
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
#1

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

18.11.2014, 11:11. Просмотров 467. Ответов 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. Выяснить, можно ли один из прямоугольников целиком поместить внутри другого прямоугольника - C++
Прямоугольники. Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри...

функция изменяет старший байт числа на заданное значение не изменяя младший байт - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

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

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

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

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

19
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:16 #2
int sum = 125 * a + 25 * b + 5*c + d;
1
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 11:20  [ТС] #3
Dani, а как их потом разложить ?
0
HighPredator
5545 / 1858 / 346
Регистрация: 10.12.2010
Сообщений: 5,444
Записей в блоге: 2
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 / 57
Регистрация: 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
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 11:40  [ТС] #6
Спасибо

Добавлено через 2 минуты
а возможно чтоб сумма была не больше 16 ?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:46 #7
tdo22, можно. просто сумму, что я предложил, возьми с минусом (а потом обратно верни знак)
1
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 11:48  [ТС] #8
Dani, можно пример ? а то я что-то не очень понял как это сделать
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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 / 57
Регистрация: 11.08.2011
Сообщений: 2,295
Записей в блоге: 2
Завершенные тесты: 1
18.11.2014, 11:54 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 12:02  [ТС] #11
Ilot, интересной метод, спасибо
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
18.11.2014, 12:15 #12
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. Один байт это наименьший объем памяти требуемый для решения данной задачи. Ибо 4 * 4 * 4 * 4 = 256.
0
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 12:21  [ТС] #13
Ilot, ок, а какую максимальную сумму можно засунуть в один байт ?
я имею ввиду больше чем 256, пользуясь Вашим кодом ?
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
18.11.2014, 12:28 #14
Цитата Сообщение от tdo22 Посмотреть сообщение
а возможно чтоб сумма была не больше 16 ?
Нет. У тебя 4 числа от 1 до 4 каждое, это соответствует четырёхзначному четвертичному числу, то есть всего имеем http://www.cyberforum.ru/cgi-bin/latex.cgi?4^4 комбинаций, как ни минимизируй максимум суммы, меньше 255-ти не получишь.
0
tdo22
10 / 10 / 1
Регистрация: 14.02.2013
Сообщений: 728
18.11.2014, 12:30  [ТС] #15
taras atavin, ясно, возможно я взял не тот подход к своей задаче.
А возможно впихнут в один байт число от 0 к 70 000 ?
Знаю что глупо звучит, так как 1 байте это не более 256, но увидев код Ilot, стало интересно возможно ли такое ?
0
18.11.2014, 12:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2014, 12:30
Привет! Вот еще темы с ответами:

Чтение бинарного файла в строку: читается только один байт - C++
Читаю бинарный файл в строку, но почему-то читает только 1 байт. Где здесь может быть ошибка? //ЧТЕНИЕ БИНАРНОГО ФАЙЛА В СТРОКУ FILE *f...

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

Как в один вектор поместить много классов? - C++
Всем привет. Есть задумка а как сделать пока не ясно. Есть в наличии допустим много классов, в этих классах одинаковые интерфейсы ввода...

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


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

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

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