`

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

 
阅读更多

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

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

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

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

三,代码

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

查询各方资料,多次杀死脑细胞后,发现:如果为负数的话将导致错误发生

改进后:


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

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

得到的代码如下:

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

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

分享到:
评论

相关推荐

    1.2进制转换.pdf

    进制的万能公式是:\( (n)_{10} = \sum\limits_{i=0}^{k}d_i \times 2^i \),其中\( n \)是十进制数,\( d_i \)是二进制数中第\( i \)位的数码,\( k \)是数码的个数。这个公式适用于任何整数或小数的转换,只需将十...

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

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

    大学《微机原理与接口技术》试卷及答案(二).docx

    8. **是非判断题**:这部分测试对计算机基础知识的理解,如第三代计算机出现了操作系统,不同计算机的指令系统不相同,bit代表二进制位而不是字节,八进制数中不包含数字8,汉字国标码GB2312-80包含6763个常用汉字等...

    江苏省二级C计算机基础练习题.pdf

    4. 进制转换:十进制数100对应的二进制是1100100,八进制是144,十六进制是64。 5. 无线电波:微波是一种高频电磁波,波长短,不易穿过建筑物,但用于移动通信和高清电视信号传输。 6. 摩尔定律:单块集成电路的...

    面试高频算法题总结-剑指Offer题解

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

    NOIP2018普及组C++试题.pdf

    14. 二进制中1的个数统计:编写代码统计一个非负整数的二进制表示中1的个数。 15. 数据结构的识别:根据给定操作序列,判断使用的是哪种数据结构。 问题求解部分: 1. 逻辑推理:根据四个人的郊游条件,逻辑推理...

    PythonTip 题库:挑战练习-入门挑战 1~31 题目 + 完整解答代码

    22.计算二进制表示中1的个数 23.第N个四面体数 24.某区间内的偶数 25.求前n个奇数 26.求第N个斐波那契数 27.翻转句子单词 28.返回字典的键值 29.计算字符串中的音节数 30.格式化数字 31.最小公倍数

    c语言第二章PPT课件.pptx

    在计算机内部,数据是以二进制形式存储的,而我们通常使用的十进制、八进制、十六进制则是方便人理解的表示方式。下面我们将深入探讨这些概念。 首先,数的表示分为数码、基和权三个要素。数码是指构成数的基本符号...

    了解计算机中的数制与字符编码.doc

    2. 基数:数制中数码的个数,如十进制基数为10,二进制基数为2,八进制基数为8,十六进制基数为16。 3. 数位:数码在数中的位置,如十进制数1234.56中,'1'处于千位,'2'处于百位,'3'处于十位,'4'处于个位,...

    计算机基础知识

    17. 最大的10位无符号二进制整数是1111111111,转换为十进制是1023,第十八题答案是C。 18. BCD码101000111表示的负数是-47,第十九题答案是B。 19. 二进制数1001101.011对应的十六进制数为95.5,第二十题答案是C...

    2014阿里巴巴笔试题

    1. 位操作:题目第11题涉及到二进制表示,计算在二进制表示中将一个数转化为全1需要的操作次数。这个问题是关于位操作和二进制计数的,计算方法是原始位数加上1的个数减去1。 2. 数据结构:第16题关于结构体的内存...

    计算机组成原理:第二章 运算方法和运算部件0.pptx

    1. 数制:计算机中最常用的是二进制、八进制、十进制和十六进制。例如,(1011.01)表示二进制数,(752.34)表示八进制数,(368.258)表示十进制数,(BD2.3C)表示十六进制数。转换通常通过按权展开法完成,例如,(2A.8)H...

    C++考级一级模拟题(编程题)- 含答案.pdf

    * 题目描述:输入一个十进制正整数n,写下从 1 到 n 的所有整数,然后数一下其中出现的数字 1 的个数。 * 输入格式:一个整数n。 * 输出格式:一个整数,即数字 1 的个数。 * 样例输入:12 * 样例输出:5 这道题目...

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

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

    计算机二级c基础知识练习.pdf

    11. 补码表示:1个字节的二进制整数,4个1和4个0,表示的最小负整数是-121。 12. 进制运算:1023-377Q+100H的结果是746H。 13. 数据溢出:两个异号的数相加或相减可能导致溢出。 14. 最大整数:无符号整数中,...

    NOIP2018第二十四届全国青少年信息学奥林匹克联赛普及组.pdf

    - 题14中要求参赛者计算一个数的二进制表示中含有1的数量,这需要对二进制数和位运算有一定了解。 7. 程序编写: - 题3的阅读程序写结果部分,要求参赛者根据给定的C++代码理解其功能并预测输出结果。给定代码中...

    第 25 届全国青少年信息学计算机奥林匹克分区联赛初赛试题普及组 C++ 语言试题与答案

    14. 位运算:统计非负整数二进制表示中1的个数,可以使用位操作技巧,如右移操作(x >>= 1)。 15. 数据结构:根据给出的操作序列,可以判断使用的是栈,因为栈具有后进先出(LIFO)的特性。 16. 逻辑推理:这是...

    总结复习内容(汇编语言)试题

    -12的二进制表示为11110100(其中第一位为符号位)。 - **反码:** 对于负数来说,原码除了符号位外,其他位取反(0变为1,1变为0)。因此,-12的反码为10001011。 - **补码:** 对于负数来说,先求出反码,再对反码...

    南京大学网络教育学院计算机基础第1次作业(含答案).doc

    如题中所示,用8位补码表示十进制整数12,其补码的十六进制表示是0CH。这种转换通常需要将十进制转换为二进制,再转换为补码形式,最后转为十六进制。 3. 补码的性质:补码由3个1和5个0组成,可以判断其最大值和...

    计算机基础知识(4).ppt

    在本文中,我们将深入探讨计算机基础知识的第二章内容,包括信息的表示、存储与运算,以及计算机系统和计算机信息系统的相关知识。 首先,我们必须了解计算机中信息的分类。在计算机内部,所有信息可以被分为两类:...

Global site tag (gtag.js) - Google Analytics