比较两个整数没有任何比较

时间:2009-01-24 22:37:58

标签: c++ if-statement comparison

是否可以在没有任何比较的情况下找到最大的两个整数?我找到了一些解决方案:

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。

15 个答案:

答案 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 中获取abs(),它实际上会返回绝对值。

干杯!

答案 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;
            }
    }
}