/**
     * 1 通过 & 运算得到最后一位 是1还是0
     * 2 >>> 运算将二进制整体往后移动
     * 下一次循环将得到第二位 是1还是0
     * 比如:-1:1111 ··· 1111 这是-1的补码
     * 1111 ··· 1111 & 0000 ··· 0001(0X00000001)= 1 得到最后一位是1
     * 然后无符号右移1位 0111 ··· 1111 重复上两步操作
     * 32次后就能得到结果
     *
     * @author hello-piper
     */
    private static int NumberOf1(int n) {
        int result = 0;
        for (int i = 0; i < 32; i++) {
            result += n & 0x00000001;
            n = n >>> 1;
        }
        return result;
    }