是否可以在没有任何比较的情况下找到最大的两个整数?我找到了一些解决方案:
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)或if(!c)是零的比较。此外,它不适用于负数。实际上我需要一个避免任何if语句的解决方案。相反,我应该使用switch语句和算术运算符。 THANX。
答案 0 :(得分:36)
减去它们,并使用令人讨厌的位杂乱黑客检查标志 http://graphics.stanford.edu/~seander/bithacks.html
如果其他程序员知道您居住的地方,请不要在生产代码中执行此操作。
答案 1 :(得分:5)
这是一个有趣的比特版本,没有任何条件分支。
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;
答案 2 :(得分:2)
问题中提出的样本中没有一个或迄今为止的任何答案都不会被零除。为什么你要试图避免'if'陈述?我怀疑有关于操作员的问题:操作员。
cout << "Maximum is: " << ((a>b)?a:b)
我们走了。
没有比较,不可能比较两个数字。你可以捏造它并进行间接操作,但是在一天结束时你会比较一些东西。相信编译器可以优化代码并选择最佳操作。
答案 3 :(得分:1)
您可能会利用计算符号a - b
取决于哪个数字更大的事实。这用于许多比较实现中。但我相信你永远无法完全避免比较。在这种情况下,您仍然至少需要评估处理器上符号标志的内容。
如果你只需要显示较低的数字,你也可以使用算术技巧:
result = ((a + b) - sqrt((a - b) * (a - b))) / 2
编辑嗯...您被允许使用switch
?
我应该使用switch语句和算术运算符。
switch
与链式if
基本相同,因此它也使用比较。这听起来好像你应该只是比较为零,看看a - b
有什么标志。
答案 4 :(得分:1)
char c;
c=0x3D + (!(b/a) && (a-b)) - (!(a/b) && (a-b));
printf("a %c b",c);
答案 5 :(得分:0)
(!(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");
虽然
有点混乱编辑:这是家庭作业吗?
答案 6 :(得分:0)
我只是看不出有任何理由这样做:谁愿意在没有“if”的情况下进行编程?
可能的答案是:
((a + b)+ abs(a -b))/ 2
我猜“abs”只是在某处隐藏了一个“if”,正如三元运算符只是“if”的另一个名字......
答案 7 :(得分:0)
Perverse Idea:使用函数指针数组。然后使用一些算术和按位运算获得该数组的索引。
答案 8 :(得分:0)
作为一种无意义的练习,这是实现cond
功能的一种方式 - 用于if
的目的,假设它(以及switch
和?:
)不知何故从语言中消失了,你正在使用C ++ 0x。
void cond(bool expr, std::function<void ()> ifTrue, std::function<void ()> ifFalse)
{
std::function<void ()> choices[2] = { ifTrue, ifFalse };
choices[expr == false]();
}
e.g。
cond(x > y,
/*then*/ [] { std::cout << "x is greater than y"; },
/*else*/ [] { std::cout << "x is not greater than y"; });
就像我说的那样,毫无意义。
答案 9 :(得分:0)
试试这个,测试一下,效果很好。
public static int compare(int a, int b)
{
int c = a - b;
return (c >> 31) & 1 ^ 1;
}
答案 10 :(得分:0)
我认为这种方法比其他方法更好,你可以使用这种逻辑c和java两种编程语言,但如果int是2字节则int应该是4字节然后使15字节右移而不是31字节。
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;
}
答案 11 :(得分:0)
在不使用比较/关系运算符的情况下获得最大的数字
void PrintGreatestNumber(int a, int b)
{
int [] x = new int[] { -1, 0, 1 };
int greatestNumber = ((a+b)+ x[ 1 + ((a-b) >> 31) - (-(a-b) >> 31)] * (a-b)) /2;
Console.WriteLine(greatestNumber);
}
答案 12 :(得分:0)
您可以使用函数使用xor按位运算符检查是否相等。 在这里,您可以将该函数编写为:
int Check(int a, int b){
return (a^b);
}
如果两个整数相同,则此函数将返回0,否则返回0。
这里,提供了一个示例来了解此功能。
让两个整数作为a = 1,b = 2
1的位是-> 00000001 而2是-> 00000010
如果在此处应用xor运算,则结果将为00000000,整数为0。 因为异或运算是:
1 xor 1 = 0
1 xor 0 = 1
0 xor 1 = 1
0 xor 0 = 0
另一种方法,您可以减去数字
int Check(int a, int b)
{
return abs(a-b);
}
此处的逻辑将与以前相同。如果我们得到0,那么它应该等于,否则等于!
答案 13 :(得分:0)
假设X和Y是两个输入。
X> Y为:(((X + Y)+ abs(X-Y))/ 2
X 现在您可以从#include 干杯!
答案 14 :(得分:-2)
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;
}
}
}