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

编程之美 2.1 求一个数的二进制表示中1的个数

2011-04-30 02:02 239 查看
/**************问题描述************
求二进制数中1的个数
**********************************/

#include<iostream>
using namespace std;

/****************解法一:直接除2*******************
对num除以2,余数为1则result加1,时间复杂度为O(logv)
v为num的二进制位数
**************************************************/
int Count1(int num){
int result=0;
while(num){
if(num %2 ==1){
result++;
}
num /=2;
}
return result;
}

/******************解法二:使用位操作*************
对num使用位运算,将num与0x01做位与,为1则result加1
时间复杂度为O(logv),v为num的二进制位数
*************************************************/
int Count2(int num){
int result=0;
while(num){
result += num&1 ;
num >>= 1;
}
return result;
}

/***************解法三:光考虑1的个数************
例如对num=15=1111,
num=num&(num-1)=1111&1110=1110,result=1;
num=num&(num-1)=1110&1101=1100,result=2;
num=num&(num-1)=1100&1011=1000,result=3;
num=num&(num-1)=1000&0111=0000,result=4;
时间复杂度O(M),M为num的位数
*************************************************/
int Count3(int num){
int result=0;
while(num){
num &= (num-1);
result ++;
}
return result;
}

/***************解法四:时空折中*****************
假设知道输入的num为几位数的话,可以预先存好每个数
有多少个1,然后到时候直接查询即可。这样需要多申请
2^n那么大的数组来保存,但是时间复杂度为O(1)
*************************************************/
#define MAIN
#ifdef MAIN
int main(){
int num=16;
int result=Count1(num);
cout<<"Result1: "<<result<<endl;
cout<<"Result2: "<<Count2(num)<<endl;
cout<<"Result3: "<<Count3(num)<<endl;
system("PAUSE");
return 0;
}
#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐