二进制中1的个数

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

可能大部分人看到这个题的第一反应就是把数字的二进制表示换成字符串,然后去找里面1的个数。这种思维是人正常的思维,但不是计算机的思维,这种方式是对计算机不友好的,因为计算机只认识0和1,那有办法通过0和1的计算来得到结果吗?答案是肯定的

 public int NumberOf1(int n) {
         //排除特殊值
        if(n==0)
            return 0;
         //当n<0的时候,取他的补码
        if(n<0)
            n=0^n;
        int num=0;
        //因为int是32位所以最多循环32次
        for(int i=0;i<32;i++){
            //把n向右移动一位,如果不是缩小2倍则末位是1,比如说111=7向右移动1位,
            //3!=7/2.0,所以末位是1
            if(n>>1!=n/2.0){
                num++;
            }
            n=n>>1;
            //如果==0就可以跳出循环了
            if(n==0)
              return num;
        }
        return num;
    }

我选择这个算法题的主要原因是希望大家在写程序的时候,适当考虑一下自己的写法是否对计算机足够友好

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值