剑指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 ...
随机推荐
- 【实用技术】DreamWeaver常用快捷键
文件菜单 新建文档 Ctrl+N 打开一个HTML文件 Ctrl+O 或者将文件从[文件管理器]或[站点]窗口拖动到[文档]窗口中 在框架中打开 Ctrl+Shift+O 关闭 Ctrl+W 保存 C ...
- jQuery 动画之 添加商品到购物车
前台页面 <link href="MyCar.css" rel="stylesheet" /> <script src="../jq ...
- php利用pdo进行mysql的事务处理机制
想进行php的事务处理有下面几个步骤 1.关闭自动提交 2.开启事务处理 3.有异常就自动抛出异常提示再回滚 4.开启自动提交 下面是一个小示例利用pdo进行的php mysql事务处理,注意mysq ...
- python部分排序算法(网友提供)
// 冒泡排序 def bubble(x,n): '''This function orders the original items x x is list,n is the length o ...
- VS2008 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
提示这个错误,自己的程序是在VS2008下编译的C/C++ win32程序,自己当时在win7上开发测试,都没有问题,正常使用,也在另一台xp系统上也试了,都没有问题.就发给客户了,没想到有些客户竟然 ...
- springMVC3学习(六)--SimpleFormController
SimpleFormController提交表单流程例如以下: login.jsp <form action="login" method="post"& ...
- Node.JS + MongoDB技术浅谈
看到一个Node.JS + MongoDB的小样例,分享给大家.魔乐科技软件学院(www.mldnjava.cn)的讲座 Node.JS + MongoDB技术讲座 云计算 +大数据 ...
- WebApplication和WebSite的区别
不同点 1. 创建方式不同 一个是FILE->NEW->PROJECT->ASP.NET WEB APPLICATION 另外一个是 FILE->NEW->WEBSITE ...
- Javascript页面跳转与浏览器兼容
用<meta>标签实现的定时跳转: <meta http-equiv="refresh" content="5 url=http://www.baidu ...
- java学习——abstract 和 final
当多个类中出现相同功能,但是功能主题不同,这时可以进行向上抽取.这时只抽取功能定义,而不抽取功能主体. 抽象:看不懂.1, 抽象方法一定定义在抽象类中.2, 抽象方法和抽象类都必须被abstract关 ...