首先想到用移位运算
其实方法很简单,就是相减后看符号位,将减的结果的符号位移位到末尾,再和1与操作,或者直接和0x80000000与,得出的符号位再右移至末尾,作为数组的下标。int型占4字节,即32位,在-1为补码的机器上,1代表负数,0代表正数
简单的c代码
int max1(int x,int y){//符号相同,返回x,y中的大值
unsigned int z;
z=((x-y)>>31)&1;
return (1-z)*x+z*y;//这种写法很巧妙
}
int max2(int x,int y){//符号不同,直接判断x的正负即可,返回最大值
unsigned int z;
z=(x>>31)&1;
return (1-z)*x+z*y;
}
int max(int x,int y){
unsigned int z;
z=((x^y)>>31)&1;//异或操作,判断符号位是否相同
return (1-z)*max1(x,y)+z*max2(x,y);
} `