牛客网刷题—剑指OFFER 011 二进制中的1的个数

一、题目描述:

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

二、解题思路

0)补充知识 : 正数的 反码 补码 都是本身  ,负数的 反码 符号位不变 其余各位取反  补码  反码加1

1)  暴力解法 : 一位一位的遍历统计1个个数 每一位与1相与运算  int类型 要循环32次 

2)巧妙解法:如果这个数不为0,那么它的二进制表示中至少有一位为1.

                        如果将这个数 -1,那么它本身最右边的1则变为0,其余位则不受影响。

                        在将其与减1后的数相与,则最右边的数变为了0.

                        如此反复,这个数有多少个1,就可以进行这么多次操作。

                        直到最后变为0

三、代码实现

class Solution {

public :
    int NumberOf1(int n){
        int count=0;
        while(n){
            n=n*(n-1);
            count++:
        }
     return count;

    }

};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值