面試題10:輸出二進位制中1的個數
阿新 • • 發佈:2018-11-09
1.解法一:
public static int findNumberOf1(int num){
int count=0;
while(num!=0){
if((num&1)!=0){
count++;
}
num=num>>1;
}
return count;
}
注意到上面的解法,有一個缺陷:當輸入的num是一個負數時,會陷入死迴圈:負數的二進位制表示中,最高位是1,當負數做右移操作時,最高位始終設定為1,所以會陷入死迴圈。
2.解法二
public static int findNumberOf1(int num){
int count=0;
int flag=1;
while(flag!=0){
if((num&flag)!=0){
count++;
}
flag=flag<<1;
}
return count;
}
為了避免死迴圈,在解法二中首先讓num與1做與運算,判斷最低位是否是1,然後讓num與2做與運算,判斷次低位是否是1,如此依次判斷到最高位,相當於flag的逐位左移,來代替num的逐位右移。
但是解法二中要迴圈的次數=二進位制中的位數,也就是說,對於32位的整數,要迴圈32次。
3.解法三:
public static int findNumberOf1(int num){
int count=0;
while(num!=0){
count++;
num=num&(num-1);//減去一個1
}
return count;
}
在解法三中,迴圈的次數等於整數中1的個數,因為把一個整數減去1,再和原整數做與運算,會把該整數最右邊的一個1變成0.