二进制中1的个数 - Java
题目描述
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
输入
10
返回值
2
思路:
看到这种题,第一时间想到的就是规律
- 个位数中,偶数需要一位1,奇数需要两位1(奇数的二进制最后一位必须是1)
- 十位数中,偶数需要两位1,奇数需要三位1…
后面才发现并不是这样,这个规律不行,哦嚯,完蛋,思路全无。
看了题解,wcao,还能这样解啊!
- 一个整数只要不为0,二进制就存在1;
- 如果把这个数减1,那么原来整数最右边的1就变成0,而右边的0又会变成1(如果有的话);
- 这时候再把原来的整数和减去1的结果作与运算,得到的数是原来整数最后一位1开始所有位变成0的数。
- 你可能会问,这个数有什么用?你没发现吗,经过这次运算,少了一个1。只要我们计数,不就能知道有多少个1了嘛!
举个栗子:
现在要算10的二进制有多少个1
- 1010(即10)减1得1001
- 1010&1001得1000
- 二进制中1数量减1
- 计数器加1
怕有童鞋忘了(低情商:不懂)与运算:
与运算 |
---|
1 & 1 = 1 |
1 & 0 = 0 |
0 & 1 = 0 |
0 & 0 = 0 |
实现Implementation
public class Solution {
public int NumberOf1(int n) {
int count = 0;
while(n!=0){
count++;
n=n&(n-1);
}
return count;
}
}
好了,今天的刷题就到这里结束