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;
}

 

posted @ 2013-03-27 20:49  放空自己  阅读(190)  评论(0编辑  收藏  举报