zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    PCB Genesis加邮票孔(线与线)实现算法
    PCB 无需解压,直接读取Zip压缩包指定文件 实现方法
    PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
    PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)
    PCB MS CLR 聚合函数 joinString加排序实现
    PCB 奥宝LDI 输出自动改周期检测内容
    如何介绍项目
    二叉树的深度
    51单片机汇编指令手册
    SSM父子工程搭建
  • 原文地址:https://www.cnblogs.com/relaxgirl/p/2985318.html
Copyright © 2011-2022 走看看