您的位置:首页 > 编程语言

求二进制中1的个数(编程之美)

2016-03-20 20:41 218 查看

求二进制中1的个数:

解法一:O(logn)

int solve(int data)
{
int cnt = 0;
while(data){
if(data & 1) cnt ++;
data = data >> 1;
}
return cnt;
}


解法二:O(M) M为1的个数

int solve(int data)
{
int cnt = 0;
while(data){
data &= data - 1;
cnt ++;
}
return cnt;
}


精髓 : v & (v - 1)

v & (v + 1) 可以去掉末尾的连续多个1(如果末尾没有1 则不用去掉)

扩展问题:

把A变成B需要改变多少位?

<=>先问题等价转化:A与B有多少位不同? 显然是先异或,然后数1的个数就好了。下面附一份代码吧。

int solve(int a, int b)
{
int cnt = 0, data = a ^ b;
while(data){
data &= data - 1;
cnt ++;
}
return cnt;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: