34.二进制中1的个数

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

题目描述

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


思路:


移位运算:左移,右移  注意负数的移位很特殊

6ab603b6800b9156a3688333e140b304_20190208234616601.png


与或非、异或、同或运算


一起考虑!


移位统计每位为1的个数,但是怎么移位?


解法1、右移出现的问题是:对于负数的右移会进入死循环,原因是:负数的最高位1需要不变,最终为0xFFFFFFFF


解法2、将1左移分别和输入的整数判断,但问题是:1需要左移32位


问题:如何依据输入数的规模实时的调整移动的位数?


解法3、将输入的数减去1,结果再和输入的数与运算,实现从二进制数右边开始数的第一个1变为0;


如果照此循环进行,则输入的数会变为0,以此作为结束移位的判断条件


解法1:


class Solution {

public:

    int  NumberOf1(int n)

    {

        int count=0;

          while(n)

          {

              if(n & 1)

              count++;

              n=n>>1;

          }

        return count;

    }

};

运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。

case通过率为0.00%


解法2:


class Solution {

public:

    int  NumberOf1(int n)

    {

        int count=0;

        unsigned int flag=1;

          while(flag)

          {

              if(n & flag)

              count++;

              flag=flag<<1;

          }

        return count;

    }

};

解法3:最优的解决方法


class Solution {

public:

    int  NumberOf1(int n)

    {

        int count=0;

          while(n)

          {

              count++;

              n=(n-1)&n;

          }

        return count;

    }

目录
相关文章
|
3月前
二进制中1的个数
二进制中1的个数
18 0
|
13天前
|
C++
Acwing.26 二进制中1的个数
Acwing.26 二进制中1的个数
|
1月前
|
算法
算法题 — 整数转二进制,查找其中1的数量
算法题 — 整数转二进制,查找其中1的数量
12 0
|
9月前
计算二进制中1的个数
计算二进制中1的个数
43 0
|
9月前
求一个整数储存在内存中的二进制1的个数
求一个整数储存在内存中的二进制1的个数
求两个数二进制中不同位的个数
题目内容:两个int(32)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子: 7
|
存储 机器学习/深度学习
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
109 0
求一个整数存储在内存中的二进制中1的个数;例如15有4个1(三种方法详解)
|
存储 前端开发 程序员
二进制中1的个数(下)
二进制中1的个数(下)
二进制中1的个数(下)
|
开发者
二进制中1的个数(上)
二进制中1的个数(上)
二进制中1的个数(上)
位运算:二进制中1的个数
题目: 输入一个 32 位整数,输出该数二进制表示中 1 的个数 注意: 负数在计算机中用其绝对值的补码来表示。 数据范围: −100≤ 输入整数 ≤100 样例1: 输入:9 输出:2 解释:9的二进制表示是1001,一共有2个1。 样例2: 输入:-2 输出:31 解释:-2在计算机里会被表示成11111111111111111111111111111110, 一共有31个1。
68 0