码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指Offer】二进制中1的个数

时间:2019-08-27 00:30:36      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:utf-8 编码   amp   题目   turn   pre   http   位运算   mamicode   public   

题目:输入一个整数,输出该数二进制表示中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的个数

标签:utf-8 编码   amp   题目   turn   pre   http   位运算   mamicode   public   

原文地址:https://www.cnblogs.com/xiexinbei0318/p/11415670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!