题目
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
程序核心思想
如果一个整数不是0,那么它的二进制一定至少有一位为1。如果把这个整数减一,会把右边数第一个1变为0,并且把这个1右边的所有0变为1。接着把这两个数做与运算,那么除了这个1以及这个1右边的所有数会变为0,其余位数不变。
举个栗子,110101000,减一之后为:110100111,做与运算之后为:110100000
这个数就变小了,在重复上述步骤:
减一之后为:110011111,做与运算之后为:110000000
减一之后为:101111111,做与运算之后为:100000000
减一之后为:011111111,做与运算之后为:000000000
所以每一步都会从最右开始,把一个1变成0,有几个1就会做几次,直到这个数变成0为止。
Tips
无
代码
public class Solution {
public int NumberOf1(int n) {
int i;
int answer = 0;
while(n != 0){
i = n - 1;
n = n & i;
answer++;
}
return answer;
}
}
网友评论