lowbit的实现
lowbit(x)
可以算出x二进制形式的从左往右的最后一个1与后面的数字组成的数对应的十进制形式
举例
- 十进制12=1100,则lowbit(12)=100=8
代码实现
int lowbit(int x)
{
return x & -x;//x&-x相当于x&(x按位取反+1)
}
具体问题
二进制中1的个数
给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。
可以通过lowbit函数得到最后一个1和后面的0组成的数,将其从原数字中减去,每减去一次,说明有一个1出现,当原数字为0,跳出循环
方法一
#include <iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int lowbit(int x)
{
return x&-x;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
int res=0;
while(a[i])
{
int lb=lowbit(a[i]);
a[i]-=lb;
res++;
}
if(i==0) cout<<res;
else cout<<' '<<res;
}
return 0;
}
方法二
与【剑指 Offer 15. 二进制中1的个数】类似
思路
- m&1表示取数字m对应二进制串的最后一位,比如m=5,则m(bin)=101,m&1=1
- m>>1表示将数字m对应二进制串右移一位
- 需要注意到,若m是int类型(有符号数),那么对于负数,右移位之后最高位会补1,从而造成死循环,但是若m是unsigned类型,则高位会补0,不会造成死循环
- 当m不为0的时候循环右移即可
- 注:uint32_t是32位unsigned int类型
代码
class Solution {
public:
int hammingWeight(uint32_t n) {
unsigned int m=n;
int s=0;
while(m)
{
s+=m&1;
m>>=1;
}
return s;
}
};