首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

计算整数二进制表示中各个1位的数目

编写一个函数,确定给定整数的二进制表示中各个1位的数目。 举例:给定一个数字是7,假设是8位操作系统,二进制表示为00000111,其中有3个1,则调用函数返回3。...整体思路:循环统计,检测二进制表示中的最后一位,如果最后一位是1的时候计数器加1,然后把数字右移一位,直到整个数字全部移完。...利用这个结论我们还可以最很多事,比如有题目: 给你一个正整数 n,请你判断该正整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false。...比如,n=4的时候就返回ture,如果n=3的时候就返回false。 整体思路:由于一个正整数是2的幂次方,那么它的二进制一定是1后面好多0这种格式,比如4的二进制就是100,8的二进制就是1000。...所以按照这个思路我们可以去掉最后一个1,如果结果是0的时候就说明这个正整数是2的幂次方。

10410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    整数的二进制表示中有多少个1的问题

    我在剑指offer上面看到这道题,看到这道题是用c++写的,但是我用java编写的时候遇到问题。 首先描述问题:         一个整数(可以为整数也可以为负数),它的二进制表示中有多少个1,。...1往左移,如果每次与操作数按位相与得出的是0,那么计数器就加一,我遇到的问题就出现在这里,如10的1的个数应该是2,而-10中1的个数应该是3,因为有一个符号位,如果不加符号处理话,那么得出数应该是30...,也就是有30个1,这就是与剑指offer上矛盾的地方,后来我分析原因是这样的,程序中我让左移停止的条件是,两个数相与为0就停止,因为一个整数是32位,而10应该是11111111111111111111111111111010...,不知道大家遇到类似问题没,运用第三种解法还可以解决好多衍伸的问题,例如判断一个数是不是2的幂,因为如果是2的幂的话,那么就只有一个1,所以只需操作一次如果为0那么就是2的幂次方,再如,判断两个整数有多少位是不同的...,涉及到不同那么我们必然会想到亦或,不同位亦或后肯定为1,所以又转换成求整数1的个数问题,所以第三种解法应该是比较优秀的 。

    29610

    集合的整数表示

    当集合的元素数比较少的时候,我们可以使用整数来表示集合(用到整数的二进制) 一些集合运算可以这么写: 空集:0 只含有第i个元素的集合{i}: 1<<i 含有全部n个元素的集合{0, 1, …, n-1...}: (1<<n)-1 判断第i个元素是否属于集合S: if(S>>i&1) 向集合中加入第i个元素:S|(1<<i) 从集合中去除第i个元素:S&~(1<<i) 集合S和T的并集:S|T 集合S和T的交集...:S&T 枚举集合S的所有子集 for( int S = 0; S < (1<<n); ++S) { //对于集合的处理 } 枚举{0, 1, …, n-1}所包含的所有大小为k的子集 下面的代码根据字典序升序...,枚举出所有满足条件的二进制码 int comb = (1<<k) - 1; while(comb < (1<<n) ) { //这里进行针对组合的处理 int x = comb &

    40920

    计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算

    上节我们提到正整数相乘的结果居然出现了负数,要理解这个行为,我们需要看下整数在计算机内部的二进制表示。 十进制 要理解整数的二进制,我们先来看下熟悉的十进制。...正整数的二进制表示 正整数的二进制表示与此类似, 只是在十进制中,每个位置可以有10个数字,从0到9,但在二进制中,每个位置只能是0或1。...看一些数字的例子吧: 二进制 十进制 10 2 11 3 111 7 1010 10 负整数的二进制表示 十进制的负数表示就是在前面加一个负数符号-,例如-123。但二进制如何表示负数呢?...查看整数的二进制和十六进制表示 在Java中,可以方便的使用Integer和Long的方法查看整数的二进制和十六进制表示,例如: int a = 25; System.out.println(Integer.toBinaryString...a = a | 0x1 //不管a原来最右边一位是什么,都将设为1 小结 本节我们讨论了整数的二进制表示,需要注意的就是负数的二进制表示,以及计算机进行二进制加减操作的过程,从而我们就能理解为什么有的时候正整数计算会出现负数

    1.1K90

    IEEE 二进制浮点数的表示

    前段时间的一个项目中,需要编写一个可以与某个设备进行长连接并接收数据的 TCP Server,该设备会把一些数据发送过来,让 TCP Server 进行解析。...最早开始接触 C 语言的时候,学习了 IEEE 浮点数表示的方式,后来也很少会接触到,更别提用到。...今天,我来将 IEEE 二进制浮点数的表示方式进行一个简单的介绍。 浮点数 在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。...而浮点数在内存中并没有使用补码进行表示。浮点数在内存中存储的方式使用了 IEEE 的编码表示方式,即使用 符号、指数 和 尾数 的形式进行存储的。...IEEE 二进制浮点数的表示: 位数  符号位  指数位  尾数位 32   1 8 23     单精度(float) 64   1 11

    91620

    整数的存储:符号加绝对值表示法

    在整数的存储:无符号表示法中谈到过,整数在计算机中有很多种存储方法,主要有下面三种:无符号表示法、符号加绝对值表示法和二进制补码表示法。这里我们讨论第二种方法:符号加绝对值表示法。...符号加绝对值表示法使用第一位(最高位)来表示符号:0表示正数、1表示复数,剩余的位表示这个数的绝对值,比如十进制7的绝对值是二进制111,如果用4位长的数据来表示7,那么+7为0111,-7为1111....这样4位长的数据可以表示16个数,正负各占一半,正的是+0~+7,负的是-7~-0.注意:符号加绝对值表示法中有两个0,+0和-0....至此,整数表示法中的无符号表示法和符号加绝对值表示法都探讨完毕,剩下的就是二进制补码表示法啦,下一篇文章我们接着讲。

    1.4K20

    二进制的转换、&、|、^ 、~、单身狗1、交换两个变量、统计二进制中1的个数、打印整数二进制的奇数位和偶数位

    2.双目操作符(&、^、|)和单目操作符~ 按位或 |:两个数的二进制以对应的第0位进行比较,两个数其中有1则计算出来的结果为1没有1则为0 按位与 &:两个数都为1则为1,否则为0 按位异或 ^:...两个数相同为0,不同为1 取反~:二进制中的数字0变1,1变0 3.单身狗1 在一个整型数组中,只有一个数字出现一次,其他数组都是成对出现的,请找出那个只出现一次的数字。...交换两个变量(不引入第三个变量) 不允许创建临时变量,交换两个整数的内容 方法1: 我们可以由将a+b的值放入a,然后b减去a现在的值就是a+b-b,那么b的值是a a减去b为a+b-a=b,a的值为...获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 #include void Print(int num) { for(int i=31; i>=1; i-=2)...编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

    10210

    浮点数的二进制表示

    要理解这个结果,一定要搞懂浮点数在计算机内部的表示方法。我读了一些资料,下面就是我的笔记。 2.在讨论浮点数之前,先看一下整数在计算机内部是怎样表示的。  ...int num=9; 上面这条命令,声明了一个整数变量,类型为int,值为9(二进制写法为1001)。...那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000? 3.根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式: ?...首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0255;如果E为11位,它的取值范围为02047。...7.再看例题的第二部分。 请问浮点数9.0,如何用二进制表示?还原成十进制又是多少? 首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。

    82610

    负数的二进制表示方法「建议收藏」

    负数的二进制表示方法 假设有一个 int 类型的数,值为3,那么,我们知道它在计算机中表示为: 00000000 00000000 00000000 00000011 因为int类型的数占用4字节(32...在计算机中,负数以其正值的补码形式表达。 什么叫补码呢?这得先从原码,反码说起。 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。...整数-1在计算机中如何表示。...举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。...这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。 2的补码的本质及正确性 我们要看先一下模的概念 “模”是指一个计量系统的计数范围。如时钟等。

    2.6K40
    领券