最大值・最小值
时间:2006-04-23 来源:oliliango
突然想到之前在cu上看到的一个主题,就是要求不用比较和判断,求最大值。当时看到强人们奇思妙想层出不穷呀,令我霎是佩服。
结果今晚上想了,试了很久才算是搞定了一个。而且还利用了gcc的特性,真是没有面子。
代码如下:
#define MAX_DIGITS sizeof(int)-1
int max(int a,int b)
{
int c[2];
c[0]=a;
c[1]=b;
int flag1=0-((a-b)>>MAX_DIGITS);
int flag2=0-((b-a)>>MAX_DIGITS);
int flag3=0-(a>>MAX_DIGITS);
int flag=(flag1&&(!flag2))||(flag1&&flag2&&flag3);
return c[flag];
}
基本上解决了边界溢出的问题,但是方式很不好。
我想如果是c++的话,可以用模板函数解决。
其实就是一时想起来了,完全是很无聊的。功能的话,一句就搞定了:
#define MAX(a,b) a>b?a:b
现在只能想到这里了,请尽情来拍板砖吧。
20070721增加:
今天把内核里面的实现拷到这里作为对比:
enjoy it.
结果今晚上想了,试了很久才算是搞定了一个。而且还利用了gcc的特性,真是没有面子。
代码如下:
#define MAX_DIGITS sizeof(int)-1
int max(int a,int b)
{
int c[2];
c[0]=a;
c[1]=b;
int flag1=0-((a-b)>>MAX_DIGITS);
int flag2=0-((b-a)>>MAX_DIGITS);
int flag3=0-(a>>MAX_DIGITS);
int flag=(flag1&&(!flag2))||(flag1&&flag2&&flag3);
return c[flag];
}
基本上解决了边界溢出的问题,但是方式很不好。
我想如果是c++的话,可以用模板函数解决。
其实就是一时想起来了,完全是很无聊的。功能的话,一句就搞定了:
#define MAX(a,b) a>b?a:b
现在只能想到这里了,请尽情来拍板砖吧。
20070721增加:
今天把内核里面的实现拷到这里作为对比:
#define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; }) #define max(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x > _y ? _x : _y; }) |
enjoy it.
相关阅读 更多 +