• 求二进制数中1的个数


               对于一个字节(8bit)的无符号整型变量,求二进制表示中1的个数。

    解法一

     除二求余法,如10100011 除以2 得01010001余1。当除二结果为1时,二进制中1的个数会减少一个,例,   

    01010001除以2得00101000余1  。当能整除2时,二进制中1的个数不变,例,00101000除以2得00010100。

    public static int getOneNumber(int num){
            int onenum=0;
            while(num!=0){
                if (num%2==1) {
                    onenum++;        
                }
                num= (num/2);
            }
            return onenum;
    }

    解法二

    位操作右移法,右移后丢弃掉的是最后一位,当最后一位是1是记录并累加,和除二求余法差不多。

    判断最后一位是1的方法是将移位的二进制数与00000001求“与”操作,结果是1的话最后一位就是1了。

    public static int getOneNumber1(int num){
            int onenum=0;
            while(num!=0){
                onenum+=num&1;
                num>>=1;
            }
            return onenum;
    }

    解法三

    减一求与法,简化分析当二进制数中只有一个1时{如,00100000}应该怎么判断?对于二进制的操作结果为0时是比较方便的,

    所以我们让操作后的结果为0,如0010000&00011111=0是,此时二进制数中只有一个1。当00011111&00011110=00011110!=0时,

    此时二进制数中的00011111中1的个数减少一个。

    public static int getOneNumber2(int num){
            int onenum=0;
            while(num!=0){
                num&=num-1;
                onenum++;
            }
            return onenum;
    }

    解法四

    罗列法,即将0-127的二进制数对应的1的个数按序存在一个数组中,可通过数组的下标直接得到数组中的值。这种方法只适合罗列的数组数比较少的时候。

    此时舍弃空间换取时间。

  • 相关阅读:
    使用 Facebook开源动画库 POP 实现真实衰减动画
    在命名空间下定义类型
    作为程序猿我给csdn博客加入打赏功能
    linux高可用集群heartbeat实现http的高可用
    杭电 HDU 1247 ACMHat’s Words(trie树 或着STL)
    取石子(一)-博弈数论
    区块链技术开发怎么结合已有产业链落地?
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
  • 原文地址:https://www.cnblogs.com/peng111/p/5641582.html
Copyright © 2020-2023  润新知