剑指offer中有一道题:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:这个数的二进制减1,然后和这个数求”与“,再减1,和上一个数求“与”,直到为0,减了1的个数就是这个数二进制的1的个数。
例如:21的二进制位10101,减1之后为10100,10101&10100=10100,10100减1为10011,10100&10011=10000,10000减1为01111,100000&011111=0,结束,一共减了3次1,所以有该二进制中有3个1。代码表示为:
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
}
这个代码还是挺经典的,对负数也同样适用。