直接将该数的二进制的每一位与1进行按位与(&)运算,算出所有结果为1的数有多少就是所求结果,代码如下

解法一:数不动1动

 @Test
    /** * 思路:将这个数的二进制的每一位都与1进行按位与计算, * 当结果等于1移位后的结果时说明这个数的二进制的这一位是1 * 详见代码 */
    public void test2() {
   
        int a = 1000;
        //输出一个数字的二进制形式用Integer.toBinaryString()方法
        System.out.println(Integer.toBinaryString(a));
        int result = 0;
        //整数的二进制是32位制的循环32次
        for (int i = 0; i < 32; i++) {
   
            if ((a & (1 << i)) == (1 << i)) {
   
                result++;
            }
        }
        System.out.println(result);
    }

解法二:1不动数动

 @Test
    /** * 这种方法是1不动,将原来的数向右移与1进行按位与运算,结果为一时 * result就++,所得就是结果 */
    public void test3() {
   
        int a = 10;
        //输出一个数字的二进制形式用Integer.toBinaryString()方法
        System.out.println(Integer.toBinaryString(a));
        int result = 0;
        //整数的二进制是32位制的循环32次
        for (int i = 0; i < 32; i++) {
   
            if (((a>>i)&1)==1){
   
                result++;
            }
        }
        System.out.println(result);
    }

解法三:巧妙使用按位与运算

  @Test
    /** * 解法3:从右到左消去1 * 方法为将原数减一与自己做按位与运算,一直算到结果为0时结束 * 循环的次数就是1的个数 */
    public void test4() {
   
        int a = 10;
        //输出一个数字的二进制形式用Integer.toBinaryString()方法
        System.out.println(Integer.toBinaryString(a));
        int result = 0;
        while (a != 0) {
   
            a = ((a - 1) & a);
            result++;
        }
        System.out.println(result);
    }