题目描述

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

分析:

这是一道很基本的考察二进制和位运算的面试题。思路:先判断证书二进制表示中最右边的一位是不是1。接着再把输入的数字右移一位,此时原来处于从右边数起的第二位被移到了最右边了,再判断是不是1.这样每次移动一位,直到整个整数变成0为止。现在的问题变成怎么判断一个整数的最右边是不是1了。这很简单,只要把整数和1做按位与运算看结果是不是1就行了。1除了最右边的一位外所有位都是0.如果一个整数与1做与运算的结果是1,表示该位最右边一位是1,否则是0。于是我们很快写出了代码(有漏洞,可能导致死循环)。

class Solution{

punlic:

int NumberOf1(int n) {

int count=0;

while(n)

{

if(n&1)

{

count++;

n>>1;

}

return count;

}

}

注意:右移运算与除以2在结果上是等价的,但是除法的效率是远远低于移位运算的。

那么问题来了,如果输入一个负数呢?比如0x80000000,运行的时候会出现什么状况呢?把负数0x80000000右移一位的时候,并不是简单地的把最高位的1移到第二位变为0x40000000,而是0xc0000000。这是因为移位前是个负数,移位后要保证仍然是个负数,因此移位后的最高位会设为1。如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环

为了避免死循环,我们可以不右移输入的数字n。首先把n与1做与运算,判断n的最低位是不是1.接着把1左移一位得到2,再和n做与运算,判断n的次低位是不是1......1逐渐变为2、4、8、....代码如下:

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

剑指offer面试题[10]-二进制中1的个数相关推荐

  1. 剑指Offer - 面试题15. 二进制中1的个数(位运算)

    1. 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:0000 ...

  2. 剑指offer面试题15. 二进制中1的个数(位运算)

    题目描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 思路 详见链接 代码 cla ...

  3. 【剑指offer-Java版】10二进制中1的个数

    二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...

  4. 剑指offer——面试题10:二进制中1的个数

    剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...

  5. [剑指offer]面试题10:二进制中1的个数

    面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...

  6. 剑指offer:面试题15. 二进制中1的个数

    题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...

  7. 剑指offer | 面试题10:斐波那切数列

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 求斐 ...

  8. 剑指offer——面试题10:斐波那契数列

    个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...

  9. 剑指Offer - 面试题4. 二维数组中的查找(双指针)

    1. 题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例 ...

最新文章

  1. hadoop W3SCHOOL
  2. 《富爸爸 辞职创业前的10堂课》文摘
  3. web前端技巧-ES6新特性与重点知识汇总(一)
  4. 一份感动到哭的成绩单……
  5. 46-单元测试(1)
  6. oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
  7. XP中CPU占用率100%原因及解决方法
  8. 首页新增“游戏开发区”链接
  9. resnext50_32x4d-inference
  10. 让A超链接无效的办法 阻止元素发生默认的行为
  11. (超详细)算法学习:STL和基本数据结构
  12. 神通数据库最新安装教程(2021年底)
  13. LDU训练赛:小srf的游戏 单调队列 + DP
  14. 2015.11--360校招面试-后台C++开发工程师
  15. Centos7---查看内存型号
  16. 安卓使用WebView清除缓存
  17. 易语言json解析 没有数组的成员数
  18. Typora去除红色波浪线
  19. CV_ELEM_SIZE1 和 CV_ELEM_SIZE两个宏的理解
  20. python apkg_Python 自动加固APK

热门文章

  1. 我讨厌电脑!一个系统管理员的自白
  2. ap sat_新手必读:7个问题分清SAT、AP、托福考试
  3. fasterrcnn论文_【论文解读】Yolo三部曲解读——Yolov1
  4. Python4班平均成绩统计_回首过去,展望未来 | 欢迎大家来到E班第一次主题班会!...
  5. groupby java_Java8的groupBy实现集合的分组
  6. mysql sqlserver alter语句区别_SQL ALTER
  7. mybatisplus代码生成连接池_SpringBoot2 高级案例(15): 配置多数据源,整合MybatisPlus增强插件...
  8. integer为null_走进 JDK 之 Integer
  9. Oracle ITL(Interested Transaction List)理解
  10. 在Mac中用快捷键快速插入日期时间