题目:求整数二进制表示中1的个数。

分析:此题直接考查二进制表示与位运算!!!

   正数和负数的二进制表示不同!在计算机中,正数的二进制表示即为通常所写的二进制;而负数的二进制表示则用补码表示,即原码的反码再+1。

   比如:1) 9:在32位计算机中表示为(十六进制)0x00000009 (其原码=反码=补码=0x00000009);

      2) -9:在32位计算机中表示为(十六进制)0xFFFFFFF7 ,原因:-9的原码=0x00000009,-9的反码=0xFFFFFFF6,-9的补码=0xFFFFFFF7

        所以,-9的二进制表示中1的个数为31 !

  另外,拿8位二进制来说,当表示有符号数时,00000000~01111111表示十进制0~127,而10000000~11111111表示十进制-128~-1 !!!

  位运算比乘除的效率更高!

解决该题时,首先想到的就是避免死循环的那种方法(这里值得骄傲一下!呵呵)

不过,虽然想到了左移1的方法,但由于当时对负数的二进制表示不熟悉,所以认为该方法可能对负数不起作用。。。

但仍先编写了如下代码,目的是验证应用于正数时是否有效:

//未考虑负数情况
int OneNumInBinaryForm(int n)
{
int Anded = ;
int i = ; //i为二进制中1的位置
int maxbits = sizeof(n)*;
//std::cout<<maxbits<<std::endl;
int OneNums = ;
while(i <= maxbits)
{
int Anded_iter = Anded<<(i-);
if((Anded_iter&n) != )
OneNums++;
i++;
}
return OneNums;
}
int main(int argc, char* argv[])
{
int n = ; int nums = OneNumInBinaryForm(n);
std::cout<<nums<<std::endl; return ;
}

不过,在理解了负数的二进制表示后,发现以上代码同样适用于负数,其总体思路和作者的参考代码一致!

但还是那句话,参考代码更加简洁、高效!

//根据作者代码,重写n为正、负数的情况
int NumberOf1(int n)
{
int count = ;
unsigned int flag = ; while(flag)
{
if((flag&n) != )
count++;
flag = flag<<;
} return count;
} int main(int argc, char* argv[])
{
int n = ; int nums = NumberOf1(n);
std::cout<<nums<<std::endl; return ;
}

参考代码中用flag作为循环终止条件,比自己所写的用数字所占位数(sizeof),要好很多。。。,关键在于自己没有想到1在循环左移后,最终会变为0!!!

经验证,-9的二进制表示中1的个数的确为 31!

作者所提供的更NB的方法太巧妙,自己很难想到啊!

int NumberOf1(int n)
{
int count = ; while(n)
{
count++;
n = n&(n-);
} return count;
}

思想:只要n非零,则n的二进制表示中必有1,且认为该1位于二进制表示的最右边。(while(n),count++);

在计数之后,消除该位置上的1(1->0),采取方法为n&(n-1)(这是较难想到的关键!);

    n=n&(n-1),再循环。

对负数,同样适用!

剑指offer--面试题10的更多相关文章

  1. 剑指offer——面试题10:斐波那契数列

    个人答案: #include"iostream" #include"stdio.h" #include"string.h" using na ...

  2. 剑指Offer面试题10(Java版):二进制中的1的个数

    题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...

  3. 剑指offer 面试题10.2:青蛙变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...

  4. 剑指offer 面试题10.1:青蛙跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 编程思想 对于本题,前提只有 一次 1阶或者2阶的跳法.a.如果两种跳 ...

  5. 剑指offer 面试题10:斐波那契数列

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0).n<=39 编程思想 知道斐波拉契数列的规律即可. 编程实现 class Solu ...

  6. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  7. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  8. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

  9. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  10. 【剑指Offer面试题】 九度OJ1368:二叉树中和为某一值的路径

    题目链接地址: http://ac.jobdu.com/problem.php? pid=1368 题目1368:二叉树中和为某一值的路径 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2252 ...

随机推荐

  1. 超赞值得一试的六款jQuery插件和CSS3应用

    1.jQuery图片横向滚动插件 这是一款利用jQuery实现的图片横向滚动插件,我们可以设置任意数量的图片,然后点击左右箭头按钮即可分组浏览这些图片.这款jQuery图片插件的优势有两点,其一是可以 ...

  2. ThinkPHP框架部署

    ThinkPHP框架部署 1.下载ThinkPHP框架 下载地址:http://www.thinkphp.cn/ ThinkPHP官方网站 下载ThinkPHP3.2.3完整版,下载后如下图所示: A ...

  3. HTML 5中的文件处理之FileAPI(转载)

    原文地址:http://developer.51cto.com/art/201202/319435.htm 在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串 ...

  4. 在hibernate中使用c3p0数据源

    1.  jar包  hibernate-release-4.1.8.Final\lib\optional\c3p0 2.  加入配置:   <!-- 数据库连接池最大连接数 -->  &l ...

  5. Android四大组件之一:Service(服务)

    Service跟Activity也是出于统一级别的组件,且与Activity的最大区别之一主要是没有人机界面,主要是运行在程序的后台(我是这么理解的),帮助文档上说的是运行于进程的主线程中,但是服务并 ...

  6. The-ith-Element

    Brief: the-ith-element,given a array A with n element , return the i-th element of A.  A(n,i) this p ...

  7. 配置Qt开发环境下的OpenCV开发

    1.使用CMake工具(http://www.cmak.org),选择MinGW Makefile. *一定要注意编译的版本要与Qt的mingw32的版本相同.否则容易出现undefined refe ...

  8. 【转】asp.net mvc3 简单缓存实现sql依赖

    asp.net mvc3 简单缓存实现sql依赖   议题 随 着网站的发展,大量用户访问流行内容和动态内容,这两个方面的因素会增加平均的载入时间,给Web服务器和数据库服务器造成大量的请求压力.而大 ...

  9. 如何更改Json.NET的序列化规则

    我想要使序列化出来的JSON都是小写,可以通过建立 LowercaseContractResolver:DefaultContractResolver 来实现, 创建Custom ContractRe ...

  10. struts2中constant参数设置

    序号 方法 说明 1 <constant name="struts.i18n.encoding" value="UTF-8"/> 指定web应用默认 ...