题目:求整数二进制表示中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. iOS - 移动设备防丢失App

    一.原理 二.数据获取 三.报警

  2. Cocos2d-x多场景切换生命周期

    在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...

  3. tar命令: 对某目录文件打tar包时,排除指定的目录或文件

     如某当前目录存在以下文件或目录: 1.txt2.txt3.txtdir1dir2my2015.tarmy2016.tar 若要对当前目录除1.txt 和dir1.tar外,打包tar 步骤一.建立e ...

  4. 7款值得你心动的HTML5动画和游戏

    1.HTML5 Canvas粒子效果文字动画特效 之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想要展示 ...

  5. 向CodeBlocks的Project中添加calss文件时,出现No such file or directory错误的解决方案

    我们在CodeBlocks中编写程序时,一般要建立工程.现在建立工程first,然后建立类文件Person,并将其添加到first中, int main() { Person p; p.display ...

  6. cadence16.3破解方法

    今天安装cadence16.3,安装了两遍都失败了,百思不得其解,结果总是出现在license上,如下图所示: 后面当然就只能启动demo版了,于是网上找,参照以前古老的法子,终于解决问题! 首先,开 ...

  7. ASP.Net网站部署失败

    部署站点时候,出现如下错误 “/”应用程序中的服务器错误. ---------------------------------------------------------------------- ...

  8. DataGridview动态添加列

    1.获取数据源(select * from table名称) 2.动态绑定数据源 private void GetTableInfo(DataTable dt) { listBh = new List ...

  9. css透明(支持各浏览器)

    opacity: 0.4;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=40); -ms-filter: "progid:D ...

  10. 飞行器的Pitch Yaw Roll概念图解

    前进方向为Z轴 Pitch 升降 绕X轴  对应常见Φ(phi)角: Yaw 偏航 绕Y轴 对应常见θ(theta)角: Roll 翻滚 绕Z轴 对应常见φ(psi)角: 对应表: 参考网址NASA: ...