以下是找到两个数字中较大数字的函数:
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));
这是如何运作的?
答案 0 :(得分:17)
int c=a-b;
c
如果a < b
则为负数,否则为正数。现在负数将设置其最高有效位(MSB)。
int k=c>>31&1;
此步骤假定sizeof(int)
为4
个字节,并在c
中提取k
的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
答案 1 :(得分:5)
当然,这仅适用于32位整数。
k=c>>31&1
隔离符号位,即0或1。
如果k
为0,则a>=b
和max = a - 0*(a-b) = a
。
如果k
为1,则a<b
和max = 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;