剑指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 ...
随机推荐
- VS如何关闭 ReSharper 提示
IDE->工具->选项->click "suspend now" button
- 工具:BT Sync 同步文件
随着互联网的发展,文件共享变得越来越便捷,但是文件的共享过程是不是安全,这一直是人们关心的问题,今天向大家介绍一个共享工具,可以实现便捷的安全共享. 这个工具分为两个部分,一个是服务器部分, ...
- 【转】手机web——自适应网页设计(html/css控制)
手机web——自适应网页设计(html/css控制) 就目前形势来看,Web App 正是眼下的一个趋势和潮流,但是,对于Web App的设计可能大家有的不是很了解,下面就将整理好的网页设计的技巧奉献 ...
- AFN的二次封装
http://www.cnblogs.com/sxwangjiadong/p/4970751.html
- 浅谈Android系统开发中LOG的使用
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6581828 在程序开发过程中,LOG是广泛使用 ...
- Codeforces 466 E. Information Graph
并查集.... E. Information Graph time limit per test 1 second memory limit per test 512 megabytes input ...
- BOOST中如何实现线程安全代码
1 需要include <boost/thread.hpp> 2 背景知识请参考<boost程序库完全开发指南>第12章 3 编绎:g++ -o mthread mthread ...
- Git 上传本地命令
1.首先建立一个文件夹用以测试 2.在test中写入一个main.c的文件 其内容如下: 3.然后就建立一个git仓库了 4.然后就是把内容加进去了,上传上去 5.然后我们看下git log的信息 6 ...
- jstl数字保留两位小数
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%><fmt:fo ...
- JS中prototype属性-JS原型模式
/* *对象方法 *类方法 * 原型方法 */ function People(name) { this.name = name; this.say = function () { //对象方法 al ...