問題一:實現一個方法,判斷一個正整數是否是2的乘方(比如16是2的4次方,返回True;18不是2的乘方,返回False)。
解:二進制數的每一位都是2的乘方,也就是說每一個2的乘方的二進制都是第一位是個1,剩下的都是0。比如:
16:10000; 32:100000。
再看一下整數減1,比如:
15:01111; 31:011111;
所以:只要是2的乘方與減1的數&一次則都爲0。
public boolean isPowerOf2(int number) {
return (number & (number - 1)) == 0;
}
問題二:實現一個方法,求出一個正整數轉換成二進制後的數字“1”的個數。
解一:與1做&運算,只要等於1,則說明這位是1,記錄一次。然後右移二進制一位,再處理。如:
15: 1111,
1111&0001=1 ---- count +1=1;
1111>>=1 ---- 111;
111&001=1 ---- count+1=2;
111>>=1 ---- 11;
11&01=1 ---- count+1=3;
11>>=1 ---- 1'
1&1=1 ----count+1=4;
public int bNumberOf1(int number) {
int count = 0;
while (number > 0) {
if ((number & 1) == 1)
count++;
number >>= 1;
}
return count;
}
解二:和上一題一樣,每次和比它小一的數&一次,他就會二進制減少一個1,能&幾回,就有幾個1。如:
20 :10100B;
19 :10011B;
10100&10011=10000; count+1=1;
10000&01111=0; count+1=2;
public int bNumberOf1s(int number){
int count=0;
while (number>0){
number=number&(number-1);
count++;
}
return count;
}
最後兩種思路的答案:
System.out.println(bNumberOf1(15)); System.out.println(bNumberOf1s(15)); System.out.println(bNumberOf1(20)); System.out.println(bNumberOf1(20));
4
4
2
2