二进制中1的个数——多种解法

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

思路一:套函数,利用语言相关函数包来做。对于Java可用toBinaryString(n)方法,得到n的二进制,如果n是负数,得到n的二进制补码,关于ja转化的函数,我不深究了,网上有总结。对于Js,可以用toString(2)函数,但是对于负数没法使用,可以先将转化为无符号数再用该函数,至于为什么,,,我也没有相通。

代码一:

java:

public class Solution {
    public int NumberOf1(int n) {
   return Integer.toBinaryString(n).replaceAll("0","").length();
    // write code here
    }
}

js:

function NumberOf1(n)
{
    //可能是错的解法
    if(n<0){
        n=n>>>0;
    }
  var count = 0;
         var arr = n.toString(2).split('1');
    return arr.length-1;
}

思路二:将一个数n与1进行"与“与”运算,可以判断该数的最右边是否为0,然后将该数右移,依次判断有多少个1,但是改方法有个缺点,负数右移补符号位1,所以可能会zao造成死循环,既无数个1.因为该方法有缺点,但如果用js来实现,还是可以的,因为Js可以将负数变成无符号数来移,这样右移就是补0,至于其他语言,我还没有找到解决改方法缺点的方法。不过该方法可以改进,变成另外一种思路,就可以解决这个缺点,具体见思路四。

代码二js:

function NumberOf1(n)
{
  
 
  var count = 0;
        while (n != 0) {
            
            if ((n & 1) == 1) {
                count++;
            }
            //无符合右移
            n = n >>>1;
        }
    return count;
    // write code here
}

思路三:为了解决思路二所存在的问题,我们可以将1左移,来与原来的数进行与操作,这样可以得出1的个数。代码如下(只贴Java,js一样差不多):

代码三java:

public class Solution {
    public int NumberOf1(int n) {
  int flag=1;
        int count=0;
        while(flag!=0){
            if((n&flag)!=0)
                count++;
            flag<<=1;
        }
        return count;
    // write code here
    }
}

思路四:如果n二进制数最右边是1,那么n-1最右边为0。如果n最右边不是1,那么n-1就会与n最右的1开始不一样,所以n&(n-1)操作相当于将n二进制数减去一个1。说起来比较难理解,举例就懂了,比如:n为0110,n-1为0101,那么n&(n-1)得到0100,与之前n对比相当于n最右边1去掉了.因此统计次数就可以了。

代码四(贴Java,其它差不多):

public class Solution {
    public int NumberOf1(int n) {
  int count=0;
   while(n!=0){
       n=n&(n-1);
       count++;
   }
    return count;
    // write code here
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值