问题一:实现一个方法,判断一个正整数是否是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