- 论坛徽章:
- 0
|
不用判断语句,求两个数的最大值
[quote]原帖由 "FH"]楼上的别添乱了,前边已经说过多次溢出的问题了,你没看?[/quote 发表:
哈哈,确实如此。再来一个。
上面那个算法有问题,由于直接调用了减法表达式,因此会出现溢出。
下面这个是修正的算法:
将一个int分成两部分,最高位为符号位,剩下的31位为负载部分。
符号位通过signed_bit得出,为0(如果>;=0)或者为1(< 0)
负载部分通过value_stuff得出,介于0到0x7FFFFFFF之间,总为正数。
value_diff宏将两个数的负载部分进行减法运算(由于负载在0-0x7FFFFFFF之间且总为正数,因此不可能溢出),为0表示计算后的结果为正数,则x的负载大于或者等于y,否则x的负载小于y。
然后预先建立一个3维数组:
对于的维分别代表:
signed_bit(x), signed_bit(y), value_diff(x, y)
然后给这个数组初始化:
x, //000 x为正数,y为正数,x负载>;=y, 那么x为最大值
y, //001 x为正数,y为正数,x负载<y, 那么y为最大值
x, //010 x为正数,y为负数,那么x为最大值 (无需考虑负载部分)
x, //011 x为正数,y为负数,那么x为最大值(无需考虑负载部分)
y, //100 x为负数,y为正数,那么y为最大值(无需考虑负载部分)
y, //101 x为负数,y为正数,那么y为最大值(无需考虑负载部分)
x, //110 x为负数,y为负数,x负载>;=y, 那么x为最大值
y //111 x为负数,y为负数,x负载<y, 那么y为最大值
剩下就是分别得到3个维的index,并返回数组中的值。
- #define signed_bit(x) (( (x) & 0x80000000) >;>; 31)
- #define value_stuff(x) ( x & 0x7FFFFFFF)
- #define value_diff(x, y) signed_bit( value_stuff(x) - value_stuff(y) )
- int Max( int x, int y)
- {
- int nums[2][2][2] =
- {
- x, //000
- y, //001
- x, //010
- x, //011
- y, //100
- y, //101
- x, //110
- y //111
- };
-
- int idx0 = signed_bit(x);
- int idx1 = signed_bit(y);
- int idx2 = value_diff(x, y);
- return nums[idx0][idx1][idx2];
- }
复制代码 |
|