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

❖ 可能引起死循环的解法

代码如下:

int CountNumbers(int n)
{int count = 0;while (n){if (n & 1) count++;n = n >> 1;}return count;
}

面试官看了代码之后可能会问:把整数右移一位和把整数除以 2 在数学上是等价的,那上面的代码中可以把右移运算换成除以 2 吗?答案是否定的。因为除法的效率比移位运算要低得多,在实际编程中应尽可能地用移位运算符代替乘除法。

面试官接下来可能要问的第二个问题就是:上面的函数如果输入一个负数,比如0x80000000,运行的时候会发生什么情况?
把负数0x80000000右移一位的时候,并不是简单地把最高位的1移到第二位变成0x40000000,而是0xC0000000。这是因为移位前是个负数,仍然要保证移位后是个负数,因此移位后的最高位会设为1。
如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。

❖ 常规解法
为了避免死循环,我们可以不右移输入的数字i。首先把i和1做与运算,判断i的最低位是不是为1。接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1……这样反复左移,每次都能判断i的其中一位是不是1。基于这种思路,我们可以把代码修改如下:

int CountNumbers(int n)
{int count = 0;unsigned int flag = 1;while (flag){if (n & flag) count++;flag = flag << 1;}return count;
}

这个解法中循环的次数等于整数二进制的位数,32 位的整数需要循环32次。

❖ 能给面试官带来惊喜的解法

把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。基于这种思路,我们可以写出新的代码:

int CountNumbers(int n)
{int count = 0;while (n){++count;n = (n - 1) & n;}return count;
}

测试用例:
● 正数(包括边界值1、0x7FFFFFFF)。
● 负数(包括边界值0x80000000、0xFFFFFFFF)。
● 0。
本题考点:
● 考查对二进制及位运算的理解。
● 考查分析、调试代码的能力。如果应聘者在面试过程中采用的是第一种思路,当面试官提示他输入负数将会出现问题时,面试官会期待他能在心中运行代码,自己找出运行出现死循环的原因。这要求应聘者有一定的调试功底。

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

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

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: 这是一道很基本的考察二进制和位运算的面试题.思路:先判断证书二进制表示中最右边的一位是不是1.接着再把输入的数字右移 ...

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

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

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

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

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

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

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

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

  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. libcurl远程获取文件大小源码
  2. 一个强迫症的Git 选择
  3. 【机器学习】基于实战项目的SVM算法库使用方法详解
  4. 深入理解最大池化为什么能够实现不变性?
  5. mysql 存储过程 无限分类,查看新闻/公告--[转帖]mysql存储过程实现的无限级分类,前序遍历树...
  6. 4怎么修边_亦木良品阻燃板怎么样
  7. 深度-图像风格变换【二】
  8. 原子操作和互斥锁的区别
  9. Android 系统(78)--应用安装时间长
  10. jquery跨域调用webService
  11. 7 php 内存泄漏_php 大数组导致内存泄露问题
  12. 自动获取服务器,c#-自动获取服务器IP到客户端
  13. Java Web应用程序开发
  14. 在AIX环境下实施Oracle 集群RAC的结构 文平
  15. a one-way repeated-measures ANOVA
  16. oracle与r语言时间转换,R语言时间序列中时间年、月、季、日的处理操作
  17. vue3实现tags
  18. 跨境电商小白:一件代发是什么?为什么要选择Starday一件代发?
  19. 超市库存管理java sql_基于JAVA的超市管理(商店库存)系统的设计与实现(Eclipse,SQLServer)...
  20. ChatGPT 中文 Prompt 提示词,常用、高频集合

热门文章

  1. 【专升本计算机】最新甘肃省专升本考试C语言部分复习题带答案
  2. C语言试题六十一之请编写函数fun:将s所指字符串中下标为偶数的字符删除,串中剩余字符形成新串放在t所指数组中。
  3. Android之使用AIDL时的跨进程回调—Server回调Client
  4. 浅谈C++类(1)--概念和构造函数
  5. linux下ffmpeg编译成so文件,一、ffmpeg编译成android使用的so库
  6. java的概率的程序_java实现一个抽奖概率类
  7. 实验 7 场景运行监控及性能测试结果分析_实验报告--软件功能测试与性能测试实验
  8. 遇到可爱女生如何搭讪?
  9. 从时速100公里行驶的车上向后发射时速100公里的棒球,会发生什么?
  10. 这相册一出手,哪个长辈搞不定?