剑指offer面试题[10]-二进制中1的个数
题目描述
输入一个整数,输出该数二进制表示中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的个数相关推荐
- 剑指Offer - 面试题15. 二进制中1的个数(位运算)
1. 题目 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输入:0000 ...
- 剑指offer面试题15. 二进制中1的个数(位运算)
题目描述 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 思路 详见链接 代码 cla ...
- 【剑指offer-Java版】10二进制中1的个数
二进制中1的个数: 思路一:循环右移给定的数,但是存在负数出现死循环的问题 思路二:声明一个变量flag并初始化为1,然后循环右移flag,循环次数是和给定数的精度也就是位数有关 思路三:用了二进制一 ...
- 剑指offer——面试题10:二进制中1的个数
剑指offer--面试题10:二进制中1的个数 关于负数的自己没想出来,这是书中的两种算法,关于位运算的知识还是得要学习一个啊... Solution1: class Solution {public ...
- [剑指offer]面试题10:二进制中1的个数
面试题10:二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. ❖ 可能引起死循环的解法 ...
- 剑指offer:面试题15. 二进制中1的个数
题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...
- 剑指offer | 面试题10:斐波那切数列
转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 求斐 ...
- 剑指offer——面试题10:斐波那契数列
个人答案: 1 #include"iostream" 2 #include"stdio.h" 3 #include"string.h" 4 ...
- 剑指Offer - 面试题4. 二维数组中的查找(双指针)
1. 题目 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 示例 ...
最新文章
- hadoop W3SCHOOL
- 《富爸爸 辞职创业前的10堂课》文摘
- web前端技巧-ES6新特性与重点知识汇总(一)
- 一份感动到哭的成绩单……
- 46-单元测试(1)
- oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
- XP中CPU占用率100%原因及解决方法
- 首页新增“游戏开发区”链接
- resnext50_32x4d-inference
- 让A超链接无效的办法 阻止元素发生默认的行为
- (超详细)算法学习:STL和基本数据结构
- 神通数据库最新安装教程(2021年底)
- LDU训练赛:小srf的游戏 单调队列 + DP
- 2015.11--360校招面试-后台C++开发工程师
- Centos7---查看内存型号
- 安卓使用WebView清除缓存
- 易语言json解析 没有数组的成员数
- Typora去除红色波浪线
- CV_ELEM_SIZE1 和 CV_ELEM_SIZE两个宏的理解
- python apkg_Python 自动加固APK
热门文章
- 我讨厌电脑!一个系统管理员的自白
- ap sat_新手必读:7个问题分清SAT、AP、托福考试
- fasterrcnn论文_【论文解读】Yolo三部曲解读——Yolov1
- Python4班平均成绩统计_回首过去,展望未来 | 欢迎大家来到E班第一次主题班会!...
- groupby java_Java8的groupBy实现集合的分组
- mysql sqlserver alter语句区别_SQL ALTER
- mybatisplus代码生成连接池_SpringBoot2 高级案例(15): 配置多数据源,整合MybatisPlus增强插件...
- integer为null_走进 JDK 之 Integer
- Oracle ITL(Interested Transaction List)理解
- 在Mac中用快捷键快速插入日期时间