/** * 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; }