對(duì)于兩個(gè)32位整數(shù)a和b宋税,請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法返回a和b中較大的。但是不能用任何比較判斷坪圾。若兩數(shù)相同晓折,返回任意一個(gè)。
給定兩個(gè)整數(shù)a和b兽泄,請(qǐng)返回較大的數(shù)漓概。
測(cè)試樣例:1,2
返回:2
思路
將整數(shù)看成2進(jìn)制數(shù),逐位進(jìn)行比較.從第30位開(kāi)始(因?yàn)榈?1位是符號(hào)位),采用與mask按位與的方式提取出每一位上的數(shù)字, 如果提取出的數(shù)字相等就可以進(jìn)行比較.與mask按位與結(jié)果不是0的那個(gè)數(shù)字比較大.
例如整數(shù)1和2,看成01和10.分別與mask=10按位與,得到00和10,這說(shuō)明10比01要大.
PS:符號(hào)位為1說(shuō)明是負(fù)數(shù), 符號(hào)位為0是正數(shù).
代碼如下:
public int getMax(int a, int b) {
int mask=1<<31;
//第一位符號(hào)位要特殊處理
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; //兩數(shù)相等
}