【剑指Offer】【位运算】15_二进制中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 编码

 

posted @ 2019-08-26 23:14  XieXinBei0318  阅读(404)  评论(0编辑  收藏  举报