题目:求一个整数的二进制数中有多少个1,例如整数10转换成二进制1010,共有2个1。
1.解题思路
int类型整数32位,拿10作为例子进行说明
00000000 00000000 00000000 00001010,用该数每次和1左移作与运算
第一次与运算 & 1左移0位
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 左移0位
结果如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
第二次与运算 & 1左移1位
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 左移1位
结果如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
第三次与运算 & 1左移2位
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 左移2位
结果如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
第四次与运算 & 1左移3位
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 左移2位
结果如下:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
2.代码实现
根据以上结果,我们发现,每次进行与运算时,当1<<n的结果与 10&(1<<n)的相等时,我们便可以确定该位置为1, java实现代码如下
public static void main(String[] args) {
int k = 63;
System.out.println(Integer.toBinaryString(k));
int count = 0;
for (int i = 0; i < 32; i++) {
if ((k & (1 << i)) == (1 << i)) {
count++;
}
}
System.out.println(count);
}
运行结果如图
3.引申题目
如何判断一个二进制数是不是2的整数次方,换个方向思考,也就是说判断一个二进制整数中只有一个位置为1.