剑指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 ...
随机推荐
- Word Break II 解答
Question Given a string s and a dictionary of words dict, add spaces in s to construct a sentence wh ...
- 30款基本UX工具 - 思维流程工具 & 原型工具
来源:GBin1.com 现在的开发人员在建造网站时,注重的是布局和技术特性,但是往往忽略了更重要的一点,那就是用户体验. 如 果用户在使用的时候,不能简单清楚的知道该要如何操作,那么他们一定会选择另 ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- 向html某个元素中添加信息
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- 常用LINUX脚本汇总(1)
1.查看磁盘使用空间 df -hl 2.查看文件或者文件夹大小 du -sh 文件(夹)名 查看文件大小 AIX系统为du -sg 3.查看当前用户下定时任务列表crontab -l 4.修改定时 ...
- UCTF Final-Hackventure
抽出世间将UCTF Final中的hackventure给记录下,算是个总结.题目是有一个游戏,游戏地图是随机生成的,用户可以攻打Server,如果3个Server都被攻占的话,那么用户就赢了,但是并 ...
- SQL:define和verify命令及替换变量&
=================替换变量&===============使用一个&符号来指定一个变量值,执行SQL语句时,会提示用户输入一个数值. SQL> select sa ...
- Android WebView 软键盘挡住输入框
解决方法一: 在所在的Activity中加入 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RES ...
- [转]Asp.Net调用前台js调用后台代码分享
1.C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> ...
- linux 系统下java开发环境的配置
在安装之前,确保你的linux系统下有 jdk,jboss等相关软件 一.配置JDK环境变量 步骤: 解压缩JDK文件: unzip jdk1.6.0_31.zip 目录下显示文件夹jdk1.6.0_ ...