输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
数据范围:- 2^{31} <= n <= 2^{31}-1−231<=n<=231−1
即范围为:-2147483648<= n <= 2147483647−2147483648<=n<=2147483647
方法一:
int NumberOf1(int n ) {
int mask = 1, i = 0, num = 0;
for(i = 0; i<32;i++){
if(mask & n){
num++;
}
mask <<= 1;
}
return num;
}
将n右移是不行的(Java语言可以进行逻辑右移),因为算数右移如果是负值,则进行补位操作,最左侧一直是一。因此考虑将掩码左移。
方法二:
int NumberOf1(int n ) {
int num = 0;
while(n){
n = n & (n-1);
num++;
}
return num;
}
非常巧妙的一种算法,规律为:一个二进制数减1,在左侧第一个1之前,所有位数发生反转,即1->0, 0->1。这样进行&运算就可以消掉最右侧的一个1,当n==0时,结束。