不用判断语句,求两个数的最大值

一, 利用abs() 求绝对值

int GetMax(int a, int b)

{

return (a + b + abs(a - b)) / 2;

}

二, 通过位运算计算正负数

#define signal_bit(x) ( x >> (sizeof(int) * 8 -1) & 1)

int GetMax( int a, int b )
{
int hash[2] = {a, b};
int index = signal_bit(a - b);
return hash[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
GetMax( 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];
}

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为最大值

四, "妙"莫过于此了

	int GetMax (int x, int y)
{
int xy, yx;

xy
= ((x - y) >> 31) & 1;
yx
= ((y - x) >> 31) & 1;
return xy * y + yx * x + (1 - xy - yx) * x;
}
	如果x>y, xy = 0; xy * y = 0; yx = 1; yx * x = x;
	如果x<y, xy = 1; xy * y = y; yx = 0; yx * x = 0;
	如果x=y, xy = 0; yx = 0;  
五, 可是只有更, 没有最
	
	int GetMax(int x,int y)
{
unsigned
int z;
z
=((x-y)>>31)&1;
return (1-z)*x+z*y;        
}
六, 可是 溢出了怎么办
	
	// x y 一为正   一为负   获取正数
	int GetPositive( int x, int y )		
	{
		unsigned int z;

		z = x >> 31 & 1;
		return z * y + (1 - z) * x;
	}
	
	int GetMaxOverflow(int x, int y)
	{
		unsigned int z;
		
		z = x ^ y >> 31 & 1;
		return (1 - z)GetMax(x, y) + z * GetPositive(x, y);
	}
七, x + y ; x - y ; 有溢出, 那就不用
	#define SHIFT (sizeof(int) * 8 - 1)
int GetMax(int x, int y)
{
unsigned
int m, n;
int ary[2] = {x, y};

m
= x ^ y;
m
= m & ~(m / 2) & ~(m / 4);
n
= m | 0x01;

return ary[ ((x & n) + n / 2) / n ^ !(m >> SHIFT)];
}
方法多出于参考与总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值