Сравнение двух целых чисел без какого-либо сравнения

Можно ли найти наибольшее из двух целых чисел без какого-либо сравнения? Я нашел несколько решений:

if(!(a/b)) // if a is less than b then division result will be zero.
{
    cout << " b is greater than a";
}
else if (!(a-b)) // we know a is greater than or equal to b now.  check whether they are equal.
{
    cout << "a and b are equal";
}
else
    cout << "a is greater than b";

Но если (c) или если (! c) - сравнение с нолем. Кроме того, это не работает для отрицательных чисел. На самом деле мне нужно решение, которое позволяет избежать любой инструкции if. Вместо этого я должен использовать операторы switch и арифметические операторы. Thanx.

Ответ 1

Вычтите их и проверьте знак, используя отвратительные бит-скручивающие хаки
http://graphics.stanford.edu/~seander/bithacks.html

Не делайте этого в производственном коде, если другие программисты знают, где вы живете.

Ответ 2

Здесь интересная версия с двумя битами, которая не имеет условных ветвей.

int g = (int)"greater";
int l = (int)"less";
int e = (int)"equal";

int a = 7;
int b = 10;

char *result = (char*)((((a - b) >> 31) & l) | (((b - a) >> 31) & g) | ((~((a - b) | (b - a))) >> 31) & e);
cout << result;

Ответ 3

Ни один из образцов, представленных в вопросе, или любой из ответов до сих пор не защищает от деления на ноль. Почему вы пытаетесь избежать заявления "если"? Я подозреваю, что вопрос о домашнем задании?: Операторы.

cout << "Maximum is: " << ((a>b)?a:b)

Мы идем.

Невозможно сравнить два числа без сравнения. Вы можете выманить его и сделать косвенную операцию, но в конце дня вы что-то сравниваете. Доверяйте компилятору, чтобы оптимизировать код и выбрать лучшие операции.

Ответ 4

Вы можете использовать тот факт, что знак вычисления a - b зависит от того, какое число больше. Это используется во многих реализациях сравнения. Но я считаю, что вы никогда не сможете полностью избежать сравнения. В этом случае вам по-прежнему необходимо оценить содержимое знакового знака на процессоре.

Если вам просто нужно отобразить меньшее число, вы также можете использовать арифметические трюки:

result = ((a + b) - sqrt((a - b) * (a - b))) / 2

EDIT erm... вам разрешено использовать switch?

Я должен использовать операторы switch и арифметические операторы.

switch в основном совпадает с цепочкой if и, как таковой, также использует сравнение. Это звучит так, как будто вы действительно должны просто сравнить с нолем, чтобы увидеть, какой знак a - b имеет.

Ответ 5

char c c = 0x3D + (! (b/a) && (a-b)) - (! (a/b) && (a-b)) printf ( "a% c b", c);

Ответ 6

(!(a/b) ?  cout << " b is greater than a" : (!(b-a) ? cout << "a and b are equal" :  cout << "a is greater than b") :  cout << "a is greater than b");

Это становится немного грязным, хотя

Изменить: это домашнее задание?

Ответ 7

Я просто не вижу причин для этого: кто захочет запрограммировать без "если"?

Возможный ответ:

((a + b) + abs (a -b))/2

Я думаю, что "abs" просто скрывает "if" где-то, как тернарный оператор, который является просто другим именем "if"...

Ответ 8

The Perverse Idea: используйте массив указателей на функции. Затем с некоторыми арифметическими и побитовыми операциями получают индекс в этот массив.

Ответ 9

Как бессмысленное упражнение, здесь способ реализации функции cond - служить цели if, предполагая, что он (и switch и ?:) каким-то образом исчез с языка, а вы используя С++ 0x.

void cond(bool expr, std::function<void ()> ifTrue, std::function<void ()> ifFalse)
{
    std::function<void ()> choices[2] = { ifTrue, ifFalse };
    choices[expr == false]();
}

например.

cond(x > y,
    /*then*/ [] { std::cout << "x is greater than y"; },
    /*else*/ [] { std::cout << "x is not greater than y"; });

Как я говорю, бессмысленно.

Ответ 10

Попробуйте это, проверив его, хорошо работает.

public static int compare(int a, int b)
{
    int c = a - b;
    return (c >> 31) & 1 ^ 1;
}

Ответ 11

Я думаю, что этот метод лучше других, вы можете использовать эту логику c и java для обоих языков программирования, но int должен быть 4 байта, если int имеет 2 байта, тогда вместо 15 байт следует сдвинуть 15 байт вправо.

enter code here

#include<stdio.h>

main()
{
   int a, b;
   printf("Enter three numbers\n");
   scanf("%d %d", &a, &b);
   printf("Largest number is %d \n",findMax( a,b ));
}
int findMax( int x, int y)
{
  int z = x - y;
  int i  = (z  >>  31)  &  0x1;
  printf("i = %d shift = %d \n", i, (z>>31));
  int  max  =  x - i  *  z;
  return max;
}

Ответ 12

void greater(int a, int b) {
    int c = a - b;
    switch(c) {
        case 0:
            cout << "a and b are equal" << endl;
            break;
        default:
            int d = c & (1<<31);
            switch(d) {
                case 0:
                    cout << "a is bigger than b" << endl;
                    break;
                default:
                    cout << "a is less than b" << endl;
            }
    }
}