剑指Offer二进制中1的个数

Posted xiexinbei0318

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer二进制中1的个数相关的知识,希望对你有一定的参考价值。

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

 

A1:判断数num的最右边一位是不是1,每次右移1位,直到数num变为0  ====> 要区分正数情况和负数情况,正数右移补0,负数右移补1

A2:避免死循环,不选择右移数num,而是左移flag  ====> 循环次数比较大,32位整数需要循环32次

A3:把数num减去1,再和原整数做位与运算。一个整数的二进制中有多少个1就可以进行多少次这样的运算

 

 

//数num右移,正数补0,负数补1

(1)Q1:可不可以把右移一位改成除以2?

    A1:不可以,除法的效率比移位要低很多,实际编程中应尽可能用移位运算符代替乘除法

(2)A2:把负数0x80000000右移1位是0xC0000000

 

//左移flag

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;
     
;

  

技术图片

 

 

 //有几个1就运算几次(减+位与)

class Solution 
public:
     int  NumberOf1(int n) 
         int count = 0;
         while(n)
         
             n = (n - 1) & n;
             count++;
         
         
         return count;
     
;

  

技术图片

 

 

相关题目:

  进制转换:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出

  bit count:输入一个long类型的数值, 求该数值的二进制表示中的1的个数 

  UTF-8编码验证:给定一个表示数据的整数数组,返回它是否为有效的 utf-8 编码

 

以上是关于剑指Offer二进制中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--15二进制中1的个数

《剑指offer》 二进制中1的个数

剑指 Offer 15. 二进制中1的个数

Lc_剑指Offer15二进制中1的个数--------位运算

剑指offer---二进制中1的个数

Leetcode---剑指Offer题15---二进制中1的个数