`
java-mans
  • 浏览: 11423639 次
文章分类
社区版块
存档分类
最新评论

【100题】第二十八 整数的二进制表示中1的个数

 
阅读更多

一,题目:输入一个整数,求该整数的二进制表达中有多少个1

例如输入10,由于其二进制表示为1010,有两个1,因此输出2

二,分析:
这是一道很基本的考查位运算的面试题。

菜鸟思考:利用除法,和取余运算计算出10进制数的二进制表示后,统计1的个数

三,代码

自己测试代码(感觉没问题)

#include <iostream>
using namespace std;
int  count_of_one(int n)
{
	int count=0;
	while(n)
	{
		if(n%2==1)
			count++;
		
		n=n/2;
	}
	return count;
}
int main()
{
	cout<<count_of_one(16)<<endl;
	return 0;
}
查询各方资料,多次杀死脑细胞后,发现:如果为负数的话将导致错误发生

改进后:

#include <iostream>
using namespace std;
int  count_of_one(int a)
{
	int count=0;
	int n;
	if(a>0)
	   n=a;
    else
       n=-a;
	while(n)
	{
		if(n%2==1)
			count++;
		
		n=n/2;
	}
	if(a>0)
	  return count;
    else
      return count+1;
}
int main()
{
	cout<<count_of_one(-10)<<endl;
	return 0;
}

四,升级版(除法的效率比移位运算要低的多,

先判断整数的最右边一位是不是1接着把整数右移一位,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1
这样每次移动一位,直到这个整数变成0为止。现在的问题变成怎样判断一个整数的最右边一位是不是1了。
很简单,如果它和整数1作与运算。由于1除了最右边一位以外,其他所有位都为0因此如果与运算的结果为1,表示整数的最右边一位是1,否则是0

得到的代码如下:

int NumberOf1_Solution1(int i)
{
      int count = 0;
      while(i)
      {
            if(i &1)
                 count ++;
           i = i >> 1;  //是相对于二进制数,向右移动一位,等价于除以2
      }
      return  count;
}

在实际编程中如果可以应尽可能地用移位运算符代替乘除法。

这个思路当输入i是正数时没有问题,但当输入的i是一个负数时,不但不能得到正确的1的个数,还将导致死循环。以负数0x80000000为例,右移一位的时候,并不是简单地把最高位的1移到第二位变成0x40000000而是0xC0000000。这是因为移位前是个负数,仍然要保证移位后是个负数,因此移位后的最高位会设为1如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。为了避免死循环,我们可以不右移输入的数字i首先i1做与运算,判断i的最低位是不是为1接着把1左移一位得到2,再和i做与运算,就能判断i的次高位是不是1……这样反复左移,每次都能判断i的其中一位是不是1。基于此,我们得到如下代码:

int NumberOf1_Solution2(int i)
{
      int count = 0;
      unsigned int flag = 1;
      while(flag)
      {
            if(i &flag)
                 count ++;
           flag = flag << 1;
      }
      returncount;
}

分享到:
评论

相关推荐

    完整学习笔记:《剑指offer》Java版代码实现

    第十题 二进制中1的个数 测试10 第十一题 数值的整数次方 测试11 第十二题 打印1到最大的n晚数 测试12 第十三题 O(1)时间删除链表节点 测试13 第十四题 使数据库中的奇数位于偶数前面 测试14 第十五题 找链表中倒数...

    计算机应用基础数制与编码PPT课件.pptx

    八进制 特点: 用八个数码表示——0、1、2、3、4、5、6、7 权展开式: 对任何一个n位整数m位小数的八进制数,可表示为: 八进制接近十进制,且与二进制转换方便,常用来对二进制数的"缩写",如:将(110111001101)...

    浙江大学C语言上机练习题附答案

    10016 十进制转换二进制 46 10017 递归函数程序设计求Fabonacci数列 48 10019 改错题error10_1.cpp 49 10022 编程题 50 10026 指定位置输出字符串 50 10027 藏尾诗 51 10028 改错题error11_2.cpp 52 40065 分解质...

    计算机基础试题-.doc

    20、在以下有关计算机中数值信息表示的表达中,错误的选项是〔相同位数的二进制补 码和原码,他们能表示数的个数也是相同的〕。 21、以下设备中属于输出的设备的是〔显示器〕。 22、个人计算机使用的键盘中,Shift...

    c程序设计习题参考(谭浩强三版)习题参考解答

    3.3请将下面各数用八进制和十六进制数表示: 2 3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。 2 3.5字符常量和字符串常量有什么区别? 3 3.6写出以下程序运行的结果: 3 3.7...

    C语言参考答案汇总(浙江大学城市学院)

    C语言参考答案汇总(浙江大学城市...60002 整数的十进制、八进制和十六进制表现形式 56 60003 分类统计字符 57 60006 验证歌德巴赫猜想 58 60007 使用函数输出整数的逆序数 59 60009 统计单词 60 60062 简单计算器 61

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    二进制中1的个数、11.数值的整数次方、12.打印1到最大的n位数13. O(1)时间删除链表节点.14.使数组中的奇数位于偶数前面15.找链表中倒数第K个节点.16.输出反转后的链表17.合并两个有序链表18.判断二叉树A中是否包含...

    javascript入门笔记

    特点 :将 a 和 b 先转换为二进制,按位比较,对应位置的数字都为1的话,那么该位的整体结果为1,否则就为0 ex:5 & 3 5 :101 3 :011 =========== 001 结果 :1 使用场合:任意数字与1做按位与操作,可以...

    《剑指Offer》题目及代码.zip

    10. 二进制中1的个数 11. 数值的整数次方 12. 打印1到最大的n位数 13. O(1)时间删除链表节点 14. 使数组中的奇数位于偶数前面 15. 找链表中倒数第K个节点 16. 输出反转后的链表 17. 合并两个有序链表 18. ...

    javalruleetcode-play-leetcode:用程序解决leetcode的算法问题

    二进制中1的个数 面试题16 数值的整数次方 面试题17 打印从1到最大的n位数 面试题18 删除链表的节点 面试题19 正则表达式匹配 面试题20 表示数值的字符串 面试题21 调整数组顺序使奇数位于偶数前面 面试题22 链表中...

    数据结构(C++)有关练习题

    &lt;br&gt; 实验八 综合实验 内容及步骤: 1、请使用C++编写班级学生学籍管理程序 每个学生的信息包括:姓名、学号和英语、数学、程序设计及体育成绩。从键盘输入数据,建立数据文件student.dat,然后,...

    上海电机学院C语言实训答案

    (29)某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。...

    世界500强面试题.pdf

    1.4.10. 统计整数二进制表示中 1 的个数........................................................102 1.5. 面试题集合(四) ....................................................................................

    大学计算机基础.doc

     2倍 C、 1/4 D、 1/2 18、 16个二进制位可表示整数的范围是()。 A、 0~65535 B、 -32768~32767 C。 —32768~32768 D。 -32768~32767或0~65535 19、 大写字母B的ASCII码值是()。 A。 65 B、 66 ...

    丢失的最小正整数leetcode-LeetCode:力码

    二进制求和 69 x的平方 70 爬楼梯 83 删除排序链表中的重复元素 108 将有序数组转换为二叉搜索树 112 路径总和 125 验证回文串 136 只出现一次的数字 139 单词拆分 141 环形链表 160 相交链表 169 多数元素 191 位1...

    delphi 开发经验技巧宝典源码

    0111 如何将二进制转换为八进制 73 0112 如何将二进制转换为十进制 75 0113 如何将二进制转换为十六进制 76 0114 如何将十进制转换为二进制 77 0115 如何将十进制转换为十六进制 78 0116 如何将十六进制...

    汇编语言_期末考试_试题.

    一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.CPU要访问的某一存储单元的实际地址称...

    算法心得:高效算法的奥秘(原书第2版).[美]Henry S.Warren,Jr(带详细书签).pdf

    18.2.1 Willans第二公式 342 18.2.2 Willans第三公式 342 18.2.3 Willans第四公式 363 18.3 Wormell公式 344 18.4 用公式来描述其他难解的函数 345 18.5 习题 350 参考答案 351 附录A 4位计算机算术运算表 395...

    《数据结构 1800题》

    有 5种表示方式:3+2,3+1+1,2+2+1,2+1+1+1,1+1+1+1+1。 ①以下是该函数的程序段,请将未完成的部分填入,使之完整 int f(m,n) int m,n; { if(m==1) return (1) ; if(n==1){ return (2) ;} if(m) {...

    丢失的最小正整数leetcode-Java_DataStructure:Java的数据结构和算法的学习

    11、二进制中1的个数 12、数值的整数次方 13、调整数组顺序使奇数位于偶数前面 14、链表倒数第k个节点 15、反转链表 16、合并两个排序列表 17、树的子结构 18、二叉树的镜像 19、顺时针打印矩阵 20、包含min函数的栈...

Global site tag (gtag.js) - Google Analytics