12

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

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";

但是 if(c) 或 if(!c) 是与零的比较。此外,它不适用于负数。事实上,我需要一个避免任何 if 语句的解决方案。相反,我应该使用 switch 语句和算术运算符。比X。

4

15 回答 15

42

减去它们并使用讨厌的小技巧检查标志
http://graphics.stanford.edu/~seander/bithacks.html

如果其他程序员知道你住在哪里,不要在生产代码中这样做。

于 2009-01-24T22:55:35.767 回答
4

这是一个没有任何条件分支的有趣的小游戏版本。

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;
于 2009-01-24T23:32:07.723 回答
1

到目前为止,问题中提供的任何样本或任何答案都不能防止被零除。你到底为什么要避免使用“if”语句?我怀疑关于 ?: 操作员的作业问题。

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

我们去吧。

没有比较就不可能比较两个数字。您可以捏造它并进行间接操作,但归根结底,您是在比较某些东西。相信编译器会优化代码并选择最佳操作。

于 2009-01-24T22:55:31.400 回答
1

您可能会利用这样一个事实,即计算的符号a - b取决于哪个数字更大。这在许多比较的实现中使用。但我相信你永远无法完全避免比较。在这种情况下,您至少还需要评估处理器上标志标志的内容。

如果您只需要显示较小的数字,您还可以使用算术技巧:

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

编辑erm ...您可以使用switch吗?

我应该使用 switch 语句和算术运算符。

switch与链式基本相同,if因此它也使用比较。这听起来好像您确实应该与零进行比较以查看符号的含义a - b

于 2009-01-24T22:58:11.050 回答
1
char c;
c=0x3D + (!(b/a) && (a-b)) - (!(a/b) && (a-b));
printf("a %c b",c);
于 2009-01-24T23:21:01.583 回答
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");

虽然有点乱

编辑:这是作业吗?

于 2009-01-24T22:41:38.790 回答
0

我只是看不出有什么好的理由这样做:没有“如果”谁愿意编程?

一个可能的答案是:

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

我猜“abs”只是在某处隐藏了一个“if”,就像三元运算符只是“if”的另一个名称......

于 2009-01-24T22:51:37.523 回答
0

错误的想法:使用函数指针数组。然后通过一些算术和按位运算获得该数组的索引。

于 2009-01-24T23:25:53.693 回答
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]();
}

例如

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

就像我说的,毫无意义。

于 2009-01-25T00:43:41.570 回答
0

试试这个,测试它,效果很好。

public static int compare(int a, int b)
{
    int c = a - b;
    return (c >> 31) & 1 ^ 1;
}
于 2013-10-14T18:24:53.620 回答
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;
}
于 2016-06-21T18:06:52.823 回答
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);
}
于 2019-03-09T20:56:39.867 回答
0

您可以使用函数来检查相等或不使用 xor 位运算符。在这里,您可以将此函数编写为:

int Check(int a, int b){
    return (a^b);
}

如果两个整数相同,此函数将返回 0,否则不返回。

在这里,包括一个例子来理解这个功能。

让两个整数作为 a = 1, b= 2

1 的位是 --> 00000001 和 2 的位是 --> 00000010

如果我们在这里应用异或运算,我们将得到 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 那么它应该是相等的,否则不是!

于 2020-09-14T18:33:37.637 回答
0

假设 X 和 Y 是两个输入。X>Y 将是:((X+Y)+ abs(XY))/2 并且 X<Y 将是:((X+Y)- abs(XY))/2

现在你可以从#include<math.h> 得到abs(),它实际上返回绝对值。

干杯!

于 2020-12-12T03:19:01.100 回答
-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;
            }
    }
}
于 2009-01-24T23:07:07.147 回答