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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Butt-Head
Заблокирован
03.07.2015, 10:25     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #1
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++ Программа с указателями. Из двух введенных множеств чисел составить третье множество
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
03.07.2015, 10:45     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #2
Уникально будет только, если байты чисел объединить.
Например так:
C++
1
2
3
unsigned long long int r;
unsigned int a,b;
r=(a<<32)| b;
Butt-Head
Заблокирован
03.07.2015, 11:06  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #3
Цитата Сообщение от zss Посмотреть сообщение
Уникально будет только, если байты чисел объединить.
не понял, а зачем A сдвигать ? (<<32) ?

Добавлено через 36 секунд
Да и потом, будет ли это уникально для : a = 3, b = 7 ; a = 7, b = 3 ...
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:14     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #4
Butt-Head, можете вменяемый пример привести?
Butt-Head
Заблокирован
03.07.2015, 11:14  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #5
Цитата Сообщение от zss Посмотреть сообщение
Уникально будет
Не, так уникально не будет.
берёшь:
int a = 3;
int b = 7;
потом берёшь
int a = 7;
int b = 3;
и получаешь тот же результат, а последовательность как я говорил - важна
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 11:16     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #6
Butt-Head, не будет такого же результата, потому что в первом случае 3 "уедет" на 32 бита "влево", а во втором - семерка "уедет" влево на 32 бита
Butt-Head
Заблокирован
03.07.2015, 11:18  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #7
Цитата Сообщение от HighPredator Посмотреть сообщение
можете вменяемый пример привести?
Могу, у меня есть два числа:
Число 1: int a;
Число 2: int b;

Нужно получить такое число 3, которое бы было уникально для каждой из любых комбинаций a и b.

допустим:
a = 3;
b = 7;
или
a = 7;
b = 3;
или
a = 3;
b = -3;
или
a = -3;
b = 3;
или
a = 10
b = 77
и тд ... Любые числа.
Так вот. Мне нужно как - то на основе A и B получать на каждую ихнюю комбинацию - уникальное значение какое - то, которое я буду в дальнейшем как ID использовать ...
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:21     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #8
Теперь понял. Решение в лоб: берете два числа, кладете их последовательно в двухинтовый буфер, берете от него md5 хэш. Будет вам уникальное значение.
Butt-Head
Заблокирован
03.07.2015, 11:23  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
не будет
Не будет!
C++
1
2
3
4
5
6
7
    unsigned long long int r;
    int a = 3;
    int b = 7;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
OUT: "0000000000000000000000000000000000000000000000000000000000000111"

C++
1
2
3
4
5
6
7
    unsigned long long int r;
    int a = 7;
    int b = 3;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
OUT: "0000000000000000000000000000000000000000000000000000000000000111"

Добавлено через 1 минуту
Цитата Сообщение от HighPredator Посмотреть сообщение
Решение в лоб: берете два числа, кладете их последовательно в двухинтовый буфер, берете от него md5 хэш.
Ой.. это ж сколько процессорных инструкций ... Всё будет тормозить ... Мне нужн ос минимальным кол-вом операций ...

А разве просто вот так не сработает:
C++
1
2
3
4
int a;
int b;
//...
int c = (a+b)*c;
?
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:26     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #10
Вам шашечки, или ехать? У вас фигурировало ключевое требование -- уникальность. Для хэшей уникальность доказана математически. Любое другое решение потребует строгого доказательства того факта, что не существует пары c и d, для которых значение бы совпало. Найдете такое -- хорошо. Как и сказал, предложенное решение -- в лоб.
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,920
03.07.2015, 11:28     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #11
Butt-Head,
должно работать,вот так проверьте:
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
#include <iostream>
#include<bitset>
#include<string>
 
int main() {
    std::cout<<sizeof(int)<<std::endl;
    {
    unsigned long long int r;
    int a = 3;
    int b = 7;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
    }
    {
    unsigned long long int r;
    int a = 7;
    int b = 3;
    r=(a<<32)| b;
 
    std::bitset<64> bs(r);
    std::cout << bs.to_string() << std::endl;
        
        
    }
    return 0;
}
Добавлено через 34 секунды
HighPredator, куда уж проще - в строку запихнуть и спец символом разделить

Добавлено через 53 секунды
Цитата Сообщение от Butt-Head Посмотреть сообщение
А разве просто вот так не сработает:
нет.Что такое c в вашем случае?
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:31     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #12
Цитата Сообщение от S_el Посмотреть сообщение
в строку запихнуть и спец символом разделить
Ну тоже вариант

Не по теме:

Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).

Butt-Head
Заблокирован
03.07.2015, 11:37  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #13
Цитата Сообщение от S_el Посмотреть сообщение
должно работать,вот так проверьте:
Я же уже проверял и сказал, что не работает. См скрин.
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
        unsigned long long int r;
        int a = 3;
        int b = 7;
        int c = (a + b)*a;
 
        std::cout << c << std::endl;
        //RESULT: 30
    }
    {
        unsigned long long int r;
        int a = 7;
        int b = 3;
        int c = (a + b)*a;
 
        std::cout << c << std::endl;
        //RESULT: 70
    }
Миниатюры
Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?  
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,920
03.07.2015, 11:37     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #14
Цитата Сообщение от HighPredator Посмотреть сообщение
Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).
Да,к тому-же хэш будет более универсальным решением,если условие на входные параметры поменяется.

Butt-Head, а какую вы задачу решаете?
Butt-Head
Заблокирован
03.07.2015, 11:39  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #15
Цитата Сообщение от S_el Посмотреть сообщение
куда уж проще - в строку запихнуть
Оверхэд по производительности

Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
а какую вы задачу решаете?
Есть дискретный звуковой сигнал, ну простой WAV файл.
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:43     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #16
Цитата Сообщение от Butt-Head Посмотреть сообщение
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
А сами не видите? Ну ок, вот у вас a = 3, b = 7. Пусть есть c = 2, d = 13. Угадайте, чему равно значение по вашей формуле? Уже не уникально.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 11:43     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #17
Не будет
Тыц: http://ideone.com/Hs3PgJ
HighPredator
 Аватар для HighPredator
5351 / 1734 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
03.07.2015, 11:46     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #18
Цитата Сообщение от Butt-Head Посмотреть сообщение
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
ИМХО, для двух отсчетов такая задача сама по себе оверхед.

Добавлено через 20 секунд
Цель какая преследуется для сего?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
03.07.2015, 11:53     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #19
А вот мой способ как раз таки работает, можете объяснить, почему вы говорите, что мой простой способ не может работать и в каких случаях?
Возьмите другие наборы чисел и увидите, что не работает. Пример:
(4+6)*4 = 40
(5+3)*5 = 40

Развеилась теория гениальности?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 11:54     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Еще ссылки по теме:

C++ Найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних
Работа с битами, вывести на экран все комбинации двух единиц и двух нулей C++
Через указатели посчитать сумму двух чисел и записать в третье C++

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

Или воспользуйтесь поиском по форуму:
Butt-Head
Заблокирован
03.07.2015, 11:54  [ТС]     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #20
Цитата Сообщение от HighPredator Посмотреть сообщение
А сами не видите?
Да, действительно ...

Цитата Сообщение от HighPredator Посмотреть сообщение
ИМХО, для двух отсчетов такая задача сама по себе оверхед.
Не, не оверхэд, да и потом всё на GPGPU
Цитата Сообщение от HighPredator Посмотреть сообщение
Цель какая преследуется для сего?
система подлинного искусственного интеллекта
Yandex
Объявления
03.07.2015, 11:54     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Ответ Создать тему
Опции темы

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