给定一个二进制串表达一个数字,求其中有多少个1。
方法一:
利用位运算遍历。
挪遍历位:
public int hammingWeight1(int n) {
int res = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1<<i)) != 0){
res++;
}
}
return res;
}
左移规则是右方补0,故按位向与后,只有对应位的数与1进行与运算。
挪数字:
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
}
右移规则是补符号位或0.
因为放入的数字是无符号字符,所以右移补0.
右移与1向与即可。
方法二:
巧用n & (n-1)
在二进制中,
n-1计算就是将原数字最后一个1变为0,并且该1右侧的所有数字变为1。
那么将n与n-1按位相与,结果也是对数字遍历,不过是利用数字本身对自身进行遍历。
public int hammingWeight(int n) {
int res = 0;
while (n != 0) {
n &= n-1;
res++;
}
return res;
}
注:虽然最后一个1右侧都变成1,可能会影响理解,实际情况是右侧都变1是因为右侧原本都是0,那么用原来的0和新变的1进行按位相与,结果仍然是0.