位移的运算
位1的个数
描述 :
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。
题目 :
LeetCode 191.位1的个数
191. 位1的个数
分析 :
首先我们可以根据题目要求直接计算,题目给定的 n 是 32 位二进制表示下的一个整数,算位1 的个数的最简单的方法是遍历 n 的二进制表示的每一位,判断每一位是否为 1,同时进行计数。
那问题就是如何通过位运算来识别到1,例如: 00001001001000100001100010001001,首先我们注意到要识别到最低位的1,可以这么做 :
00001001001000100001100010001001
& 00000000000000000000000000000001
= 00000000000000000000000000000001
也就说将原始数字和1进行&运算就能知道最低位是不是1了,那其他位置怎么算呢? 我们可以有两种思路,让1不断左移或者将原始数据不断右移。例如将原始数据右移就是 :
00000100100100010000110001000100
& 00000000000000000000000000000001
= 00000000000000000000000000000000
很明显此时就可以判断出第二位是0,然后继续将原始数据右移就可以依次判断出每个位置是不是1了。因此是不是1,计算一下(n>>i) & 1就可以了
解析 :
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
for(int i = 0;i < 32;i++){
count += (n >>> i) & 1;
}
return count;
}
}
这期就到这里 , 下期见!