求一个long类型数的二进制中1的个数
二进制
正数的 原码反码补码都一样,
负数的原码符号位为1
反码符号位不变按位取反
补码等于反码加一
如果要区分两个不同的数A,B
C=A^B //找出不同位
C&=(~C+1) //找出A,B第一位不同位
A或B &C一定有一个为零
1.求二进制中1的个数
n&(n-1)
该位运算去除 n 的位级表示中最低的那一位。
n : 10110100
n-1 : 10110011
n&(n-1) : 10110000
时间复杂度:O(M),其中 M 表示 1 的个数。
public int NumberOf1(int n) {
int cnt = 0;
while (n != 0) {
cnt++;
n &= (n - 1);
}
return cnt;
}