现在的位置: 首页 > 综合 > 正文

不用判断语句比较两个数的大小值

2013年09月10日 ⁄ 综合 ⁄ 共 710字 ⁄ 字号 评论关闭

skyereeee在其博客《不用判断语句比较两个数的大小值》(链接为http://blog.csdn.net/skyereeee/article/details/7449597)一文中提出此问题,并给出了一个解决方案。并且还附上了此问题的论坛,论坛地址为:http://www.chinaunix.net/old_jh/23/422544.html。
问题描述:两个int类型的数据,不用任何的判断语句,如if、switch、?:等,找出其最大值。
在论坛中A0110A针对问题提出了如下解决方案:
int max(int x,int y)
{
int i=sizeof(int)*8-1;
int buf[2]={x,y};
int z;
z=x-y;
z=z>>i;
z=z&1;
return buf[z];
}

此方案唯一的缺点是当两个整数相减溢出时,结果会出错。

针对溢出我采取的方案是先求得两个数的平均值,其中一个任意一个数与平均值相减则不会溢出。如果一个数比它们的平均值大,则另一个数就会比平均值小。求最大值,只要找出两个数中比平均值较大的即可。

代码如下:

int max(int x,int y)
{
int i=sizeof(int)*8-1;
int buf[2]={x,y};
int z,w;

z=(x+y)/2;
w=x-z;
w=w>>i;
w=w&1;
return buf[w];
}

其中z保存x,y的平均值。

可以将其一般化成模版函数,如下:

template<typename T>

T max(T x, T y)

{

int i=sizeof(T)*8-1;

T buf[2]={x,y};

T z,w;

z=(x+y)/2;

w=x-z;

w=w>>i;

w=w&1;

return buf[w];

}

抱歉!评论已关闭.