Algorithm 这段代码如何在不使用任何比较运算符的情况下找到三个数字中最大的一个?

Algorithm 这段代码如何在不使用任何比较运算符的情况下找到三个数字中最大的一个?,algorithm,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)); 这是怎么回事 int c=a-b; c如果a>31&1隔离符号位,即0或1 如果k为0,则a>=b和max=a-0*(a-b)=a 如果k是1,那么a试

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

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));
这是怎么回事

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

此步骤假定
sizeof(int)
4
字节,并提取
k
c
的MSB。所以
k
不是
0
就是
1

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

当然,这只适用于32位整数

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

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


如果
k
是1,那么
a试试这个。。很长,对不起: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;

注意,这适用于Java和C。它可能对C和C++工作,但是移位负数是这两个技术上的未定义行为。如果恶魔从你鼻子里飞出来,不要责怪你自己以外的任何人。行为是实现定义的,而不是未定义的。鼻魔不会被观察到。
c
a时为负值
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;