一、位运算符的奇巧银技-(3)二进制中1的个数

233 阅读2分钟

题目:求一个整数的二进制数中有多少个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);
    }

运行结果如图

image.png

3.引申题目

如何判断一个二进制数是不是2的整数次方,换个方向思考,也就是说判断一个二进制整数中只有一个位置为1.