max=((a+b)+abs(a−b))/2min=((a+b)−abs(a−b))/2
所以问题,转换为如何不使用大于、小于、if语句,实现求一个数的绝对值;
int abs(int x)
{
return ((x>>31)&0x01)?(~x+1:x);
}
因此:
#define MAX(a, b) ((a) + (b) + (((a)-(b)) >> 31 & 0x01 ? ~((a)-(b))+1:((a)-(b)))) >> 1
// 注意 + 的优先级要高于 >>
#define MIN(a, b) ((a) + (b) - (((a)-(b)) >> 31 & 0x01 ? ~((a)-(b))+1:((a)-(b)))) >> 1
其实将宏转换为函数可能更为清晰一点:
int max(int x, int y)
{
return ((x+y) + (x-y>>31 & 0x01 ? ~(x-y)+1:(x-y)))>>1;
}
int min(int x, int y)
{
return ((x+y) - (x-y>>31 & 0x01 ? ~(x-y)+1:(x-y)))>>1;
}