如果不使用任何比较运算符,此代码如何找到三个数中最大的数字?

时间:2011-11-27 06:05:21

标签: algorithm

以下是找到两个数字中较大数字的函数:

int larger(int a,int b)
{
    int c=a-b;
    int k=c>>31&1;
    int max=a-k*c;
    return max;
 }

要查找三个数字中最大的数字,请将其命名为:

larger(a,larger(b,c));

这是如何运作的?

3 个答案:

答案 0 :(得分:17)

int c=a-b;

c如果a < b则为负数,否则为正数。现在负数将设置其最高有效位(MSB)。

int k=c>>31&1;

此步骤假定sizeof(int)4个字节,并在c中提取k的MSB。因此k可以是01

int max=a-k*c;

替换c = a-b,我们得到max = a-k*(a-b)。所以当

k = 0, max = a-0*(a-b)
           = a

k = 1, max = a-1*(a-b)
           = b

答案 1 :(得分:5)

当然,这仅适用于32位整数。

k=c>>31&1隔离符号位,即0或1。

如果k为0,则a>=bmax = a - 0*(a-b) = a

如果k为1,则a<bmax = a - 1*(a-b) = a-a+b = b

历史上,指令流水线操作是使用避免if测试的代码的主要原因。如果管道很深并且处理器不使用分支预测,那么由于管道重新填充和处理推测商店(如果有的话),六个整数操作比花费的时间更少。使用分支预测,具有if(或等效)的代码可能更快。无论哪种方式,保存或丢失的纳秒成本可能永远不会超过该代码的程序维护成本。

答案 2 :(得分:-3)

试试这个......很长,对不起:P

while(x && y && z)
{
        x--;y--;z--;c++;
}


if(x && y)
{
while(x && y)
{
    x--;y--;c++;
}
if(x) c+=x;
if(y) c+=y;
}


if(z && y)
{   
while(z && y)
{
    z--;y--;c++;
}
if(z) c+=z;
if(y) c+=y;
}

if(x && z)
{
while(x && z)
{
    x--;z--;c++;
}
if(x) c+=x;
if(z) c+=z;
}

return c;