-任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4
普通法,右移
public class Solution {
public int hammingWeight(int n) {
int sum = 0;//计数器
while(n != 0) {
if((n&1)==1)
sum++;
n>>=1;
}
return sum;
}
}
同上,进阶点
int BinaryNumOf1(int num)
{
int count = 0;//计数器
int flag = 1;//对1进行操作
while (flag)
{
if (num & flag)
{
count++;
}
flag = flag << 1;//向左移,拿他那个1与num进行与运算
}
return count;
}
感觉这个不太行
public class Solution {
public int hammingWeight(int n) {
int sum = 0;
for(sum;n;n>>=1){//n等于0时结束循环。n每次右移一位
sum+=(n&1);
}
return sum;
}
}
妙法
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int sum=0;
while(n!=0){
sum++;
n=(n&(n-1));//每次只影响最右边的1,左边部分的1不影响
}
return sum;
}
}