Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Butt-Head
Заблокирован
#1

Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? - C++

03.07.2015, 10:25. Просмотров 1267. Ответов 34
Метки нет (Все метки)

Hi
Есть два числа, допустим: int a и int b, как можно их "сопряч", то есть что - то с ними сделать, что бы получить третье число, уникальное для любого набора этих А и B. Причём порядок следования A и B так же важен.

То есть есть два числа:
1. Первое число (допустим типа int)
2. Второе число (допустим типа int)

Нужно получить любой третье число, допустим int c, которое бы не повторяется для любых других комбинаций и последовательностей исходных чисел.

Да, и самое главное, нужно это сделать с минимальным кол-вом операций, т.к. эти вычисления производятся очень и очень часто (миллиарды раз в секунду)

Казалось бы, что может быть проще:
int a = 3;
int b = 7;
взял, да умножил: int c = a * b = 3 * 7 = 21, но, если будет комбинация наоборот:
int a = 7;
int b = 3;
результат будет тот же, а исходные данные поменялись... И т.д. и тп.

Я пока вижу, как можно сделать это в три действия:
C++
1
int c = (a + b)*c;
но тут лишнее действие на мой взгляд...
может быть есть какая то хитрая процессорная инструкция для быстрого преобразования подобных вещей?
Может быть хитрый XOR или ещё что - то ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 10:25     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Посмотрите здесь:

C++ Через указатели на указатели посчитать сумму двух чисел и записать в третье
Вывести на экран только те, у которых сумма первых двух цифер равна сумме двух последних. C++
C++ Среди чисел найти все, у которых сумма первых двух равна сумме последних двух
Определить, равна ли сума двух первых цифр четирезначного числа суме двух последних C++
C++ среди чисел k,l,r два одинаковых,а в третье отлично от них.Переменной n присвоить значение числа,отличного от двух одинаковых
C++ Программа с указателями. Из двух введенных множеств чисел составить третье множество
C++ Найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Butt-Head
Заблокирован
03.07.2015, 11:56  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #21
Цитата Сообщение от Croessmah Посмотреть сообщение
Хмм, действительно разные. Но почему то на http://ideone.com одно, а у меня другое... Почему так?
И работает ли ваш способ для любой комбинации ?
Миниатюры
Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?  
Croessmah
Модератор
Эксперт CЭксперт С++
12729 / 7189 / 802
Регистрация: 27.09.2012
Сообщений: 17,736
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 12:22     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #22
Надеюсь, проект сохранили и построили перед запуком и во время построения ошибок не было? Компилятор какой?
Butt-Head
Заблокирован
03.07.2015, 12:36  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #23
Цитата Сообщение от Croessmah Посмотреть сообщение
Компилятор какой?
А там на скрине видно - minGW.
Хмм, странное дело, попробовал собрать студийным компилятором (MSVS2013), стало всё как у вас на idode-е.
Значит mingGW - ерунда

Добавлено через 1 минуту
Вредный кошак, так что, ваш под мои задачи как бы подходит? То есть для любой комбинации будет уникальное число? Или всё таки лучше с хэшом замочорится ?
zss
Модератор
Эксперт С++
6193 / 5796 / 1877
Регистрация: 18.12.2011
Сообщений: 14,809
Завершенные тесты: 1
03.07.2015, 12:39     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #24
Предлагаю еще один.
По коду самый короткий вариант
C++
1
2
3
4
5
6
7
8
9
union A
{
    unsigned long long int r;
    unsigned int a[2];
};
...
A x;
x.a[0]=3;x.a[1]=7;
cout<<x.r;
Butt-Head
Заблокирован
03.07.2015, 12:42  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #25
Цитата Сообщение от zss Посмотреть сообщение
x.a[0]=3;x.a[1]=7;
А где тот 'r' задаётся вообще? Или тот что - то со сдвигом в памяти самой структуры?

Ой.. это ж юнион :-)
Такс... А как тогда подобный код работает? Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
Croessmah
Модератор
Эксперт CЭксперт С++
12729 / 7189 / 802
Регистрация: 27.09.2012
Сообщений: 17,736
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 12:45     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #26
Butt-Head, у меня на mingw такой проблемы нет.

Добавлено через 1 минуту
Butt-Head, это не структура, это объединение. В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
Butt-Head
Заблокирован
03.07.2015, 12:54  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #27
Цитата Сообщение от Croessmah Посмотреть сообщение
В данном случае r и a хранятся в одной области памяти и, соответственно, изменения в a изменят и r
ну я как бы правильно понимаю, что:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Ты как бы просто соединяешь два инта в один 64-х битный и надеешься, что он получится уникальным? Но так ли это ?
Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
это объединение
Размер юниона на сколько я помню равен размеру максимального элемента и если записывается элемент меньшей размерности, то он пишется как бы в начало ?
Croessmah
Модератор
Эксперт CЭксперт С++
12729 / 7189 / 802
Регистрация: 27.09.2012
Сообщений: 17,736
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 12:58     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #28
Butt-Head, первое число в старших 32-х битах, второе число - в младших. По сути, вы сохраняете два числа и "их позиции". Изменение чисел или их порядка даст другую комбинацию бит в двоичном коде. Само собой, числа должны быть из допустимого диапазона - 32 бита на число (либо знаковые, либо беззнаковы).
zss
Модератор
Эксперт С++
6193 / 5796 / 1877
Регистрация: 18.12.2011
Сообщений: 14,809
Завершенные тесты: 1
03.07.2015, 13:03     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <iomanip>
using namespace std;
 
union A
{
    unsigned long long int r;
    unsigned int a[2];
};
 
int main()
{
    A x;
    x.a[0]=0X12345678;x.a[1]=0X9ABCDEF0;
    cout<<hex<<x.r<<endl;
    system("pause");
    return 0;
}
вывод
9ABCDEF012345678
Butt-Head
Заблокирован
03.07.2015, 13:13  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #30
В общем всем спасибо, я понял, что оптимальный вариант - просто объединить два мелких числа в одно большое.
Цитата Сообщение от S_el Посмотреть сообщение
r=(a<<32)| b;
А вот это некоторыми компиляторами не понималось наверное потому, что тут и A и B изначально по 32 бита, то есть всё что справа идёт в рамках 32-х бит, а потом уже приводится к 64-х битному R. Вот если бы было что - то типа
C++
1
r=(a<<32)| (long long)b;
тогда бы всё сразу заработало!
Ещё раз всем спасибо!

Добавлено через 7 минут
Стоп! Ещё не всё чёрт побери
Один раз я таким макаром ID получу, но что, если мне нужно будет не основание уже этих 64-х битных ID получить ещё одно уникально ? Мне каждый раз нужно будет удваивать размерность? Хмм... вронг вэй ...
Как бы без удваивания размерности всё таки решить мою задачу? Может всё таки с хэшами всякими ?
zss
Модератор
Эксперт С++
6193 / 5796 / 1877
Регистрация: 18.12.2011
Сообщений: 14,809
Завершенные тесты: 1
03.07.2015, 14:21     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #31
Скорее в сторону архивации и сжатия данных типа zip, rar, gif,png и т.д.
Butt-Head
Заблокирован
03.07.2015, 15:09  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #32
Цитата Сообщение от zss Посмотреть сообщение
Скорее в сторону архивации и сжатия данных типа zip, rar, gif,png и т.д.
А если допустить наличие некоторого третьего числа, которое бы дополняло это уникальное число (которое есть С в нашем случае и которое является хитрым сплетением А и B) ?
Тогда задача упроститься? Или опять придётся удваивать данные?
SatanaXIII
Супер-модератор
Эксперт С++
5580 / 2614 / 239
Регистрация: 01.11.2011
Сообщений: 6,428
Завершенные тесты: 1
03.07.2015, 15:52     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #33
Наверное я повторяюсь с предыдущими ораторами, но
Цитата Сообщение от Butt-Head Посмотреть сообщение
Казалось бы, что может быть проще:
int a = 3;
int b = 7;
взял, да умножил: int c = a * b = 3 * 7 = 21, но, если будет комбинация наоборот:
int a = 7;
int b = 3;
результат будет тот же, а исходные данные поменялись
Так результат и при вот этом будет таким же:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Я пока вижу, как можно сделать это в три действия:
C++
1
int c = (a + b)*c;
Даже если мы первое число инвертируем побитно и проведем, скажем, XOR со вторым (что даст различие в порядке следования чисел), то не факт, что два других числа не дадут такое же результирующее. Тем более, что по мере роста чисел, при приближении к максимальному числу для данного типа, будут теряться старшие биты, что опять же даст одинаковое результирующее число для пары, у которой старшие биты не потеряны.

Данная задача из области хеширования. Надо искать решение там.

В общем виде ваша задача не решается.
Butt-Head
Заблокирован
03.07.2015, 16:08  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #34
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Данная задача из области хеширования. Надо искать решение там.
Хмм... Ну ок. Ну в теории ведь и хеши могут повторяться, там какая - то очень маленькая вероятность, но всё же она есть, верно ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 16:20     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Еще ссылки по теме:

Работа с битами, вывести на экран все комбинации двух единиц и двух нулей C++
Через указатели посчитать сумму двух чисел и записать в третье C++
Вывести на экран элементы массива, сумма первых двух цифр равна сумме двух последних C++
Перебрать все возможные комбинации трех чисел от нуля до двух C++
Из двух квадратных матриц создать третью, перемножив элементы первых двух согласно условию C++

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

Или воспользуйтесь поиском по форуму:
Max Dark
В поиске работы
1611 / 1412 / 505
Регистрация: 09.10.2013
Сообщений: 3,204
Записей в блоге: 8
Завершенные тесты: 2
03.07.2015, 16:20     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #35
в число разрядности n можно записать 2n уникальных значений
у вас есть 2 числа разрядности n и вам нужно для каждого сочетания этих чисел получить уникальный индификатор
количество вариантов этих сочетаний == 2n*2n==22*n
т.е. для уникального индификатора этого сочетания требуется 2*n бит
Yandex
Объявления
03.07.2015, 16:20     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Ответ Создать тему
Опции темы

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