2.1求二进制数中1的个数
#include<iostream> using namespace std; int count1(int a); int count2(int N); int count3(int N); int main(){ cout<<"二进制数中1的个数是:"<<count1(32)<<endl; cout<<"二进制数中1的个数是:"<<count2(18)<<endl; cout<<"二进制数中1的个数是:"<<count3(32)<<endl; system("pause"); } int count1(int a){ int num=0; while(a!=0){ num+=a%2; // 如果除的过程有余,就表示当前位置有一个1. a=a/2; } return num; } int count2(int N){ //使用位操作 int num=0; while(N!=0){ num+=N&0x01; //结果为1则表示当前八位数的最后一位为1,否则为0 。 N>>=1; } return num; } /* 前两个解决方法的时间复杂度均为log2V,log2V为二进制数的位数 解法三的时间复杂度只与“1”的个数相关 */ int count3(int N){ //在每次判断中仅与1来进行判断。 int num=0; while(N){ N&=N-1; num++; } return num; }
用空间换取时间的解法:把0~255中“1”的个数直接存储在数组中,整数v作为数组的下标,countTable[v]就是v中1的个数。算法的时间复杂度为O(1)。
在一个需要频繁使用这个算法的应用中,通过“空间换取时间”来获取高的时间效率是一个常用的方法,具体的算法还应针对不同的应用进行优化。
扩展问题: 两个整数(二进制表示)A和B,问把A变为B需要改变多少位?即为求A和B的二进制表示中有多少位是不同的?
#include<iostream> using namespace std; int count1(int a,int b); int main(){ cout<<"整数A和B的二进制表示中有"<<count1(12,16)<<"位是不同的"<<endl; system("pause"); } int count1(int a,int b){ int num=0; while(a>b?a:b){ if(a%2!=b%2){ num++; }; a=a/2; b=b/2; } return num; }