Ответ 1
Вычтите их и проверьте знак, используя отвратительные бит-скручивающие хаки
http://graphics.stanford.edu/~seander/bithacks.html
Не делайте этого в производственном коде, если другие программисты знают, где вы живете.
Можно ли найти наибольшее из двух целых чисел без какого-либо сравнения? Я нашел несколько решений:
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.
Вычтите их и проверьте знак, используя отвратительные бит-скручивающие хаки
http://graphics.stanford.edu/~seander/bithacks.html
Не делайте этого в производственном коде, если другие программисты знают, где вы живете.
Здесь интересная версия с двумя битами, которая не имеет условных ветвей.
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;
Ни один из образцов, представленных в вопросе, или любой из ответов до сих пор не защищает от деления на ноль. Почему вы пытаетесь избежать заявления "если"? Я подозреваю, что вопрос о домашнем задании?: Операторы.
cout << "Maximum is: " << ((a>b)?a:b)
Мы идем.
Невозможно сравнить два числа без сравнения. Вы можете выманить его и сделать косвенную операцию, но в конце дня вы что-то сравниваете. Доверяйте компилятору, чтобы оптимизировать код и выбрать лучшие операции.
Вы можете использовать тот факт, что знак вычисления a - b
зависит от того, какое число больше. Это используется во многих реализациях сравнения. Но я считаю, что вы никогда не сможете полностью избежать сравнения. В этом случае вам по-прежнему необходимо оценить содержимое знакового знака на процессоре.
Если вам просто нужно отобразить меньшее число, вы также можете использовать арифметические трюки:
result = ((a + b) - sqrt((a - b) * (a - b))) / 2
EDIT erm... вам разрешено использовать switch
?
Я должен использовать операторы switch и арифметические операторы.
switch
в основном совпадает с цепочкой if
и, как таковой, также использует сравнение. Это звучит так, как будто вы действительно должны просто сравнить с нолем, чтобы увидеть, какой знак a - b
имеет.
char c c = 0x3D + (! (b/a) && (a-b)) - (! (a/b) && (a-b)) printf ( "a% c b", c);
(!(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");
Это становится немного грязным, хотя
Изменить: это домашнее задание?
Я просто не вижу причин для этого: кто захочет запрограммировать без "если"?
Возможный ответ:
((a + b) + abs (a -b))/2
Я думаю, что "abs" просто скрывает "if" где-то, как тернарный оператор, который является просто другим именем "if"...
The Perverse Idea: используйте массив указателей на функции. Затем с некоторыми арифметическими и побитовыми операциями получают индекс в этот массив.
Как бессмысленное упражнение, здесь способ реализации функции 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"; });
Как я говорю, бессмысленно.
Попробуйте это, проверив его, хорошо работает.
public static int compare(int a, int b)
{
int c = a - b;
return (c >> 31) & 1 ^ 1;
}
Я думаю, что этот метод лучше других, вы можете использовать эту логику 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;
}
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;
}
}
}