二进制中1的个数 剑指offer java题解

二进制中1的个数

时间限制:1秒 空间限制:32768K 热度指数:233498

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

有三种方法:

  • 1.利用java内置函数将整数转换成二进制字符串,再计算字符串中1的个数
  • 2.利用位运算特点n&(n-1)会将二进制最右的1消掉的原理,能做多少次这样的与运算就有几个1,直到0为止
  • 3.无符号数右移,将该整数的每一位做右移后都作为新的一个数的最后一位再与1做与运算,是1则为1,0则为0

package test;

//输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
public class offer_5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(NumberOf1(5));//2
        System.out.println(NumberOf2(5));//2
        System.out.println(NumberOf3(5));//2
    }

    //java内置函数将整数转换成二进制字符串,逐个字符比较,例如5
     public static int NumberOf1(int n) {
         int count=0;
         String s=Integer.toBinaryString(n);//s="101"
         for(int i=0;i<s.length();i++)
         {
             if(s.charAt(i)=='1')
             {
                 count++;//i=0 和i=2时指定位置上字符为‘1’,count分别加一次
             }
         }
         return count;
     }

     //利用位运算的特点,n与n-1做与运算会将二进制最右边的1去掉,所以能做一次与运算代表去除一个1,
    // 直到为零为止,例如5
     public static int NumberOf2(int n) {
         int count=0;
         while(n!=0)
         {
             count++;
             n=n&(n-1);
             // n=5时 101&100=100  count加一次,下一个循环n=100 则100&011=0 count加一次 
            // 下一次n=0不满足循环条件跳出循环没有再次做与运算,count也无法再加
         }
         return count;

     }

     //无符号右移,依次将整数的二进制向右移一位,则从右开始向左,每一位都作为新数的最后一位,
    // 与1做与运算时相当于检查该数最后一位是否为1,为1则count加1,例如5
     public static int NumberOf3(int n) {
         int count=0;
        for(int i=0;i<32;i++)
        {
            if((n>>>i&1)==1)//将n看成二进制形式,如5,“....0000 0101” i=0时,..0101&1=1,count加一
        //  i=1时,..010&1=0,不加,i=2时,..01&1=1,count加一,i=3及更大的数时,都是..0000&1=0,不加
            {
                count++;
                //如5,“101”有两个1则会有2个数末尾为1,这两个数与1做与运算时等于一于是count计数加一
            }
        }
         return count;

     }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值