一、题目
————————————————
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
————————————————
二、思路
————————————————
n&(n-1)
该位运算去除 n 的位级表示中最低的那一位。

n       : 10110100
n-1     : 10110011
n&(n-1) : 10110000

时间复杂度:O(M),其中 M 表示 1 的个数。
————————————————
三、解决问题
————————————————
测试用例

  1.正数(包括边界值1、0x7FFFFFFF)

  2.负数(包括边界值0x80000000、0xFFFFFFFF)

  3.0
————————————————

package swordoffer;

/**
 * @author LQ
 * @version 1.0
 * @date 2020-03-20 9:09
 */
/**
 * 题目描述
   输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

 */
public class Solution14 {
    public static void main(String[] args) {
        Solution14 demo = new Solution14();
        System.out.println("==============================");
        demo.test1();
        System.out.println("==============================");
        demo.test2();
        System.out.println("==============================");
        demo.test3();
        System.out.println("==============================");
        demo.test4();
        System.out.println("==============================");
        demo.test5();
        System.out.println("==============================");
        demo.test6();
        System.out.println("==============================");
    }

    /**
     * n&(n-1)
       该位运算去除 n 的位级表示中最低的那一位。
       时间复杂度:O(M),其中 M 表示 1 的个数。
     * @param n
     * @return
     */
    public int NumberOf1(int n) {
        int count = 0;
        while(n != 0){
            count++;
            n &= (n-1);
        }
        return count;
    }

    // =========测试代码=========
    void test(String testName, int n, int expected) {
        if (testName != null)
            System.out.println(testName + ":");
        if (NumberOf1(n) == expected) {
            System.out.println("    soluton1:" + "passed  ");
        } else {
            System.out.println("    solution1:" + "failed  ");
        }
    }

    void test1() {
        test("Test for 0", 0, 0);
    }

    void test2() {
        test("Test for 1", 1, 1);
    }

    void test3() {
        test("Test for 10", 10, 2);
    }

    void test4() {
        test("Test for 0x7FFFFFFF", 0x7FFFFFFF, 31);
    }

    void test5() {
        test("Test for 0xFFFFFFFF", 0xFFFFFFFF, 32);
    }

    void test6() {
        test("Test for 0x80000000", 0x80000000, 1);
    }

}

图片说明
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。