对于两个32位整数a和b,请设计一个算法返回a和b中较大的。但是不能用任何比较判断。若两数相同,返回任意一个。
给定两个整数a和b,请返回较大的数。
测试样例:1,2
返回:2
思路
将整数看成2进制数,逐位进行比较.从第30位开始(因为第31位是符号位),采用与mask按位与的方式提取出每一位上的数字, 如果提取出的数字相等就可以进行比较.与mask按位与结果不是0的那个数字比较大.
例如整数1和2,看成01和10.分别与mask=10按位与,得到00和10,这说明10比01要大.
PS:符号位为1说明是负数, 符号位为0是正数.
代码如下:
public int getMax(int a, int b) {
int mask=1<<31;
//第一位符号位要特殊处理
if(((a&mask)^(b&mask))==1){
if((a&mask)==0)return a;
else return b;
}
mask>>>=1;
while(mask!=0){
if(((a&mask)^(b&mask))!=0){
if((a&mask)==0)return b;
else return a;
}
else{
mask>>=1;
}
}
return a; //两数相等
}
网友评论