您的位置:首页 > Web前端

剑指offer-10 二进制中1的个数

2015-05-06 15:18 435 查看
#include <iostream>

using namespace std;

//位运算
/*
一个数与1 进行& ,实际是这个数的二进制的最后一位与1&
*/

/*
方法一:将这个数与1求&,然后右移一位
可能会引起死循环
*/
unsigned int NumberOfOne_1(int n)
{
unsigned int result = 0;
while(n)
{
if(n&1)
result++;
n = n>>1;
}
return result;
}

/*
方法二:首先,n&(flag=1) 计算 n的最低位是不是1
然后 flag<<1==2,计算n的次低位是不是1
继续 flag == 4,这样循环往复,每次都能判断N的其中一位是不是1,
有多少个1,就会循环多少次
*/
unsigned int NumberOfOne_2(int n)
{
unsigned int result = 0;
unsigned int flag = 1;
while(flag)
{
if(n&flag)
result++;
cout<<"flag = "<<flag<<endl;
flag = flag<<1;
}
return result;
}

/*
如果一个数不等于0,那么他的二进制中至少有一位1
考虑,对这个数减一的情况
1、如果这个数的最右一位是1,那么最后一位变为0,而其他位不变
2、如果这个数的最右一位不是1,假设这个数最右边的1位于第M位,那么减一时,
第m位变成0,m位之后的全部变成1,第m位之前的保持不变
3、现在考虑将一个数与这个数减一求与操作
将这个数最右边的1变成0。
即:将一个数与这个数减一求与,会把这个数最右边一个1变成0.一个数中的二进制有多少1,
就会进行多少次这样的操作。
*/
unsigned int NumberOfOne_3(int n)
{
unsigned int result = 0;
while(n)
{
result++;
n = n&(n-1);
}
return result;
}

int main()
{
cout << NumberOfOne_2(15) << endl;
//cout << NumberOfOne_1(15) << endl;
cout << NumberOfOne_3(15) << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: