题目:请实现一个函数,输入一个函数,输出该数二进制表示中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的个数的更多相关文章

  1. 剑指Offer - 九度1513 - 二进制中1的个数

    剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...

  2. 【剑指Offer】11、二进制中1的个数

      题目描述:   输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   解题思路:   本题有以下两个解决方案:   (1)依次判断每一位.判断的方法是先与1相与,为1则说明该位为1 ...

  3. 剑指offer 11. 位运算 二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示.   //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数     private stat ...

  4. 剑指offer(11)二进制中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目分析 首先我们要了解计算机中负数使用补码表示的,原码.补码的概念以及原理可以参考这里,这个题目我们应该从二进制入手,值得 ...

  5. 剑指offer【12】- 二进制中1的个数

    输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. public class Solution { public int NumberOf1(int n) { String str = ...

  6. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  7. 《剑指offer》面试题10 二进制中1的个数 Java版

    书中方法一:对于每一位,用1求与,如果为1表明该位为1.一共要进行32次,int4字节32位. public int check(int a){ int result = 0; int judge = ...

  8. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  9. 剑指offer——面试题15:二进制中 1的个数

    // 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...

随机推荐

  1. HDU3336——KMP算法

    题意是问所有前缀出现的次数和,mod10007: 想一想next数组代表什么意思,是从当前失配位置走到上一个匹配位置的后面,next[i]的值说明以当前位置为结尾,长度为next[i]的后缀,与以开头 ...

  2. js网页返回页面顶部的小方法

    咳咳,在网页出现滚动条的时候,许多网站会在右下角出现一个图标,点击可以回到页面顶部 本文就记录下js实现代码: 1.在html页面body添加dom元素 <img src="toTop ...

  3. Linux系统启动流程及grub重建(1)

    日志系统 Linux系统启动流程 PC: OS(Linux) POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel--& ...

  4. <% %> 、 <%= %> 、<%# %> 的区别

    1,<% %>用来绑定后台代码    中间一般放函数或者方法,典型的asp程序写法. 在前台页面可以写后台代码                 相当于开辟了C#空间,可以写C#代码 2,& ...

  5. Cookie知识点小结

    问题是什么?有哪些技术?如何解决? 1. Cookie 1)完成回话跟踪的一种机制:采用的是在客户端保存Http状态信息的方案 2)Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在 ...

  6. bash的元字符(下)

    ` "Esc"键正下方键,替换命令 PS1=`command` {} 在当前shell中运行命令 {command1;command2} | 创建命令间的管道 command1 | ...

  7. fatal error: malformed or corrupted AST file: &#39;Unable to load module &quot;/Users/apple/Library/Developer

    在同一时候安装使用Xcode5, Xcode6之后, 常常遇到这个问题. fatal error: malformed or corrupted AST file: 'Unable to load m ...

  8. date命令小结

    date命令是查看日期时间的常用命令,date MMDDhhmmYY.ss(修改顺序)用来更改时间 linux时间分为系统时间和硬件时间, [root@www doc]# clock--------- ...

  9. javascript学习笔记(一)

    学习书籍 Javascript高级程序设计 第3,4章 javascript数据类型 Undefined(undefined) Null(null,空指针) Boolean(true,false) N ...

  10. mvc原理和mvc模式的优缺点

    一.mvc原理   mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离.提高了程序的可维护性.可移植性.可扩展性与可重用性,降低了程序的开发难度.它主要分模型.视图.控制器三层. 1.模型 ...