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

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

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

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

03.07.2015, 10:25. Просмотров 1457. Ответов 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++
Определить, равна ли сума двух первых цифр четирезначного числа суме двух последних C++
Из двух квадратных матриц создать третью, перемножив элементы первых двух согласно условию C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,184
Завершенные тесты: 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
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 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
Модератор
Эксперт CЭксперт С++
13052 / 7315 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 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
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 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
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 3
03.07.2015, 11:26     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #10
Вам шашечки, или ехать? У вас фигурировало ключевое требование -- уникальность. Для хэшей уникальность доказана математически. Любое другое решение потребует строгого доказательства того факта, что не существует пары c и d, для которых значение бы совпало. Найдете такое -- хорошо. Как и сказал, предложенное решение -- в лоб.
S_el
2092 / 1599 / 306
Регистрация: 15.12.2013
Сообщений: 6,427
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
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,431
Записей в блоге: 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
2092 / 1599 / 306
Регистрация: 15.12.2013
Сообщений: 6,427
03.07.2015, 11:37     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух? #14
Цитата Сообщение от HighPredator Посмотреть сообщение
Я просто за md5 потому, что такой хэш отлично парсится по значению на hex-блоки (отлично для индексации в ассоциативных массивах).
Да,к тому-же хэш будет более универсальным решением,если условие на входные параметры поменяется.

Butt-Head, а какую вы задачу решаете?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 11:39     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Еще ссылки по теме:
Вывести на экран элементы массива, сумма первых двух цифр равна сумме двух последних C++
Вывести на экран только те, у которых сумма первых двух цифер равна сумме двух последних. C++
C++ Найти все четырехзначные числа у которых сумма первых двух цифр равна сумме двух последних
C++ Через указатели на указатели посчитать сумму двух чисел и записать в третье
C++ среди чисел k,l,r два одинаковых,а в третье отлично от них.Переменной n присвоить значение числа,отличного от двух одинаковых

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

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

Добавлено через 1 минуту
Цитата Сообщение от S_el Посмотреть сообщение
а какую вы задачу решаете?
Есть дискретный звуковой сигнал, ну простой WAV файл.
Мне нужно на каждую выборку из двух отсчётов получить уникальный ID.
Yandex
Объявления
03.07.2015, 11:39     Как сделать из двух чисел третье, уникальное для любой комбинации первых двух?
Ответ Создать тему
Опции темы

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