编程之美 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
相关文章推荐
- 编程之美 2.7 最大公约数 扩展问题之逆转一个整数的二进制表示
- Java算法总结:输入一个整数,求该整数的二进制表示中有多少个1
- 枚举一个数二进制表示下的子集
- 一个整数N二进制表示中1的个数
- 将一个整数的二进制表示的奇数位与偶数位交换位置
- 打印一个0到1之间的数的二进制表示
- 2.3题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位取反后输出
- 求逆转一个整数的二进制表示
- 求一个数二进制表示中1的个数
- 28.整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 逆转一个整数的二进制表示问题
- 第二单元 计算机信息表示 2.1十进制与二进制
- C语言求一个整数的二进制形式表示中1的个数,用函数实现
- 一个负数如何用二进制表示?
- 打印一个0到1之间的数的二进制表示
- 2.4 题目:输入一个整数a,再输入两个整数p(p<32),v(0|1),将该整数a的p位设置为v,输出修改后的该整数的二进制表示.
- 求一个unsigned int 数的二进制表示中有多少个1?
- 输入一个整数a,再输入两个整数p1ip2(p1,p2<32),将该整数的二进制表示方法中从右端开始的p1到p2位i
- 编程实现求一个整数的二进制中0和1的个数
- 给定一个正整数,找出一个数:与其二进制表示中1的个数相同,比该数小,而且最接近