對于兩個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; //兩數相等
}