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;