剑指offer-面试题10:二进制中1的个数
题目:请实现一个函数,输入一个函数,输出该数二进制表示中1的个数。例如把9
表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2.
这道题最典型的方法就是用移位统计,就比如统计9的二进制1个数:
1.9的二进制位1001,9-1的二进制位1000.
2.两者做与运算,结果为1表示最后一位为1,否则为0
3.将1001向右移位一位然后重复上述步骤直到该数字为0停止
代码实现如下:
#include <iostream>
using namespace std; int NumberOf1(int n)
{
int count=;
while(n)
{
if(n&)
count++;
n=n>>;
}
return count;
} int main(int argc, char* argv[])
{
int number;
cout<<"Please input the Number: ";
cin>>number;
cout<<"count '1': "<<NumberOf1(number)<<endl;
return ;
}
运行截图:

但是有个问题,这种方法不适合负数
因为负数的右移位后最高位的符号位仍然需要保留。
剑指offer一书提供一种方法:
其思路是这样:
1.首先取一个flag整数,并且让flag=1;
2.让flag&number 如果为1则证明最低位为1
3.flag<<1 同时flag&number 如果为1则证明次低位为1.
4.知道flag移位了sizeof(number)*8次便完成统计。
说明:flag的数据类型应与number的数据类型一致。
这种方法实现如下:
int NumberOf1(int n)
{ int count=;
unsigned int flag=;
while(flag)
{
if(n&flag)
count++; flag=flag<<;
}
return count;
}
运行结果:

其实我们可以分析一下负数在内存中存储方式:
以-9为例,将设int战4个字节
原码:1000 0000|0000 0000|0000 1001
补码(原码除符号位之外取反加1):1111 1111|1111 1111|1111 0111
我们既然是这样我们可以对负数来说:
1.先取负数的相反数-number,此时-number>0
2.-number-1,同时让-number-1按照方法1的方式右移位计算count
3.取sizeof(num)*8-count即为负数在内存中存储的1的个数
验证代码如下:
#include <iostream>
using namespace std; int NumberOf1(int n)
{ int count=;
n=n-;
while(n)
{
if(n&)
count++;
n=n>>;
} count=sizeof(n)*-count; return count;
} int main(int argc, char* argv[])
{
int number;
cout<<"Please input the Number: ";
cin>>number;
cout<<"count '1': "<<NumberOf1(-number)<<endl;
return ;
}
验证结果:

剑指offer-面试题10:二进制中1的个数的更多相关文章
- 剑指Offer - 九度1513 - 二进制中1的个数
剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...
- 【剑指Offer】11、二进制中1的个数
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 解题思路: 本题有以下两个解决方案: (1)依次判断每一位.判断的方法是先与1相与,为1则说明该位为1 ...
- 剑指offer 11. 位运算 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 private stat ...
- 剑指offer(11)二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目分析 首先我们要了解计算机中负数使用补码表示的,原码.补码的概念以及原理可以参考这里,这个题目我们应该从二进制入手,值得 ...
- 剑指offer【12】- 二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. public class Solution { public int NumberOf1(int n) { String str = ...
- 剑指offer编程题Java实现——面试题10二进制中1的个数
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...
- 《剑指offer》面试题10 二进制中1的个数 Java版
书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指offer——面试题15:二进制中 1的个数
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...
随机推荐
- mongodb----修改器
$inc:增加或者减少指定键值,如果键不存在,就创建一个键. $set:指定一个健的值,如果键不存在,就创建一个键. $unset:删除指定的键. $push:向指定的数组末尾加添加一个元素,如果数组 ...
- 3 Sum 解答
Question Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fi ...
- Ubuntu 启动器/快捷方式/ 制作 (Eclipse为例)
首先,在路径/usr/share/applications/,中创建eclipse.desktop(如果没有的话) sudo touch /usr/share/applications/eclipse ...
- Unity Navigation面板了解
上次讲解了下Navigation的简单使用, 这次来看看Navigation面板的一些参数 NavigationStatic 勾选后表示该对象参与导航网格的烘培. OffMeshLink Genera ...
- Oracle与DB2的区别
系统结构概述 首先,我们需要理解 Oracle 使用的架构,并理解它与 DB2 的不同之处.图 1 展示了 Oracle 的系统结构.将该图与 图 2 进行比较,后者显示了 DB2 的系统结构.在阅读 ...
- 解决angular 与django的冲突
{% block main %} <script type="text/javascript" src="http://cdnjs.cloudflare.com/a ...
- SpringMVC的@ResponseBody返回JSON,中文乱码问题的解决.
SpringMVC的@ResponseBody,返回json,如果有中文显示乱码的解决办法. 在SpringMVC的配置文件中 <bean class="org.springframe ...
- FlashbackQuery:SCN与timestamp示例
Flashback QueryFlashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行 ...
- Intel Core i7的整体操作
Intel Core i7的整体操作(我们也称呼为Nehalem,他的项目代码名) 主要分成2个部分-指令控制单元Instruction Control Unit(ICU),负责从存储器读出指令序列, ...
- Retrieving the COM class factory for component with CLSID XX failed due to the following error: 80070005 拒绝访问。
环境及异常信息说明 环境说明: Win2008 R2 企业版 x64 .IIS 7.0 功能说明:服务端操作Excel,(上传Excel到服务器,并在服务器端读取Excel中的数据) 异常信息:Ret ...