整数的二进制表示中1的个数
- 格式:docx
- 大小:46.08 KB
- 文档页数:7
int的表示范围在计算机科学中,int是一种表示整数的数据类型。
它能够表示的整数范围是有限的,这个范围取决于所使用的系统架构和编译器实现。
下面,我们来讨论一下int的表示范围,包括它的数据类型和底层二进制表示。
1. 数据类型在大多数编程语言中,int是一种固定长度的数据类型。
例如,在C语言中,int通常由4个字节(32位)表示;在Java中,则是由4个字节(32位)或8个字节(64位)表示,具体取决于所使用的虚拟机和操作系统。
这个长度限制int表示的整数范围。
例如,32位的int可以表示从-2147483648到2147483647之间的整数,也就是2的31次方的负一次方到2的31次方减一之间的整数。
2. 底层二进制表示在计算机内部,整数通常以二进制形式表示。
对于int类型而言,它的二进制表示通常是一个带符号的补码表示。
举个例子,如果int是32位的,那么表示-1的二进制形式为:11111111 11111111 11111111 11111111这个二进制表示形式的第一个位表示符号位,0表示正数,1表示负数。
接下来31个位表示数值的绝对值,其中最高位是2的31次方,最低位是2的0次方。
这种二进制表示形式的优势是可以方便进行加减乘除等操作,但是有一个缺点就是它不支持大于32位的整数,因为超过32位的整数无法以标准的二进制形式表示。
3. 不同系统上的int最后,需要注意的是,int类型的表示范围也会因为不同的系统而有所不同。
例如,在64位系统上,int可能会被扩展为64位,可以表示更大的整数范围。
但是,在嵌入式系统中,int的大小可能会更小,通常只有16位或者更少,这样可以节省内存空间。
总之,int类型的大小和表示范围取决于所使用的系统和编译器实现。
在编写代码时,需要了解自己的系统中int类型的具体表示范围,以避免数据溢出等问题。
二进制数1和二进制数1相加,输出为二进制形式的10.
二进制数的加法运算法则是:0+0=00+1=11+0=11+1=10(被加数和加数为1,结果本位主0,按“逢二进一”法向高位进位1)举例说明:对二进制数(1011)和(1010)求和被加数(1 0 1 1 )加数(1 0 1 0 )进位+ 1 1和数1 0 1 0 1 即结果为(10101)
相关信息:
十进制数1的二进制是1。
十进制整数转换为二进制整数采用的是“除2取余,逆序排列”法。
具体做法是用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
二进制数(binaries)是逢2进位的进位制,0、1是基本算符;计算机运算基础采用二进制。
电脑的基础是二进制。
二进制是计算技术中广泛采用的一种数制。
二进制数据是用0和1两个数码来表示的数。
它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。
计算机中用得最多也是CPU唯一能认出的数制,那就是二进制。
计算机是处理信息的机器,信息处理的前提是信息的表示。
计算机内信息的表示形式是二进制数字编码。
也就是说,各种类型的信息(数值、文字、声音、图像)必须转换成数字量即二进制数字编码的形式,才能在计算机中进行处理。
8位带符号数表示范围1. 什么是8位带符号数8位带符号数是一种数据类型,用8个二进制位来表示一个数值,并且可以表示正负两种符号。
这种数据类型常用于计算机中存储和处理整数。
一位二进制数可以表示0或1,而8位二进制数则可以表示256种不同的数值。
当使用带符号数时,其中一位被用作符号位,用来表示正负。
因此,8位带符号数可以表示的范围是从-128到127。
2. 8位带符号数的表示范围8位带符号数可以表示的范围可以通过简单的计算得到。
其中,最高位表示符号位,剩下的7位用来表示数值。
最高位为0表示正数,为1表示负数。
对于正数来说,剩下的7位可以表示的范围是0到127。
因此,正数的表示范围为0到127。
对于负数来说,由于最高位为1,表示的是一个负号。
剩下的7位表示了数值。
负数的表示范围可以通过将剩下的7位看作是一个无符号数来计算。
对于一个7位的无符号数来说,可以表示的范围是0到127。
但是,由于要表示负数,所以负数的表示范围是从-1到-128。
综上所述,8位带符号数的表示范围是从-128到127。
3. 为什么是-128到127在计算机内部,数值是以二进制的形式存储的。
而对于带符号数来说,最高位被用作符号位,表示正负。
由于只有8位,所以最高位只能表示0或1,即表示正数或负数。
如果希望使用更多位来表示数值范围,可以增加数据类型的位数。
例如,使用16位带符号数可以表示更广范围的整数。
为什么8位带符号数的范围是从-128到127而不是其他范围,是因为在计算机内部使用补码来表示带符号数。
补码是一种表示负数的方法,可以利用正数的表示范围来表示负数。
补码的计算方法是将正数取反(按位取反)再加1。
例如,对于正数5,可以表示为00000101,取反后为11111010,加1后为11111011,即-5的补码。
通过补码的计算方法,8位带符号数的最小值是-128,最大值是127。
4. 应用场景8位带符号数的表示范围相对较小,但在一些特定的应用场景中仍然有其独特的优势。
最大的十位无符号二进制整数二进制数是计算机中最基本的数字系统,它由0和1两个数字组成,通过不同位数的组合,可以表示出各种各样的数字。
在计算机中,二进制数的位数通常是8位或16位,但是在一些特殊情况下,需要使用更多位的二进制数来表示更大的数字。
本文将介绍最大的十位无符号二进制整数,以及它在计算机中的应用。
首先,我们来看一下什么是无符号二进制整数。
在计算机中,数字可以分为有符号和无符号两种类型。
有符号数字包括正数、负数和零,而无符号数字只包括非负数和零。
在二进制中,有符号数字通常使用补码表示,而无符号数字则直接使用二进制表示。
例如,十进制数255可以表示为11111111(8位二进制数),它是一个无符号二进制整数。
接下来,我们来寻找最大的十位无符号二进制整数。
由于十位二进制数的最高位为1,因此最大的十位无符号二进制整数为1111111111。
换算为十进制数,它的值为1023。
这个数字非常重要,因为它是在十位二进制数范围内最大的数字,可以表示出所有小于等于1023的非负整数。
最大的十位无符号二进制整数在计算机中有很多应用。
首先,它是在计算机中表示内存地址的常用方式之一。
在32位计算机中,内存地址通常使用32位二进制数表示,而在64位计算机中,则使用64位二进制数表示。
但是,在一些特殊情况下,需要使用更少的位数来表示内存地址,例如在一些嵌入式系统中。
此时,可以使用十位无符号二进制整数来表示内存地址,可以表示出1024个不同的内存地址。
其次,最大的十位无符号二进制整数也可以用来表示计算机中的一些特殊标志位。
在计算机中,标志位通常用来表示某种状态或条件是否成立。
例如,在处理器中,可以使用标志位来表示上一次运算的结果是否为零、是否发生了溢出等。
此时,可以使用十位无符号二进制整数中的某些位来表示这些标志位,可以表示出多达10个不同的标志位。
最后,最大的十位无符号二进制整数还可以用来表示计算机中的一些特殊数据类型。
n位二进制数表示的范围二进制数是一种由0和1组成的数字系统,它是计算机内部数据存储和处理的基础。
在二进制系统中,每一位的数值表示2的幂次方,从右往左依次增加。
n位二进制数表示的范围是从0到2的n次方减1,共计2的n次方个数。
二进制数的表示方法可以用来描述和处理各种问题,包括数字、文字、图像等等。
下面将从不同角度介绍n位二进制数的表示范围及其应用。
一、数字范围以4位二进制数为例,它可以表示的数字范围是从0000到1111,即从0到15。
每一位的数值为2的幂次方,从右往左依次为1、2、4、8。
通过四位二进制数的组合,我们可以得到从0到15的所有整数。
二、逻辑运算二进制数可以用来进行逻辑运算,如与、或、非等。
以两个4位二进制数进行与运算为例,两个数的对应位上的数值相同才为1,否则为0。
通过逻辑运算,我们可以实现数据的筛选、过滤和处理。
三、位运算位运算是对二进制数的每一位进行操作的运算方法。
常见的位运算包括左移、右移、与、或、异或等。
通过位运算,我们可以实现对二进制数的位操作,如提取某一位的数值、将某一位设置为1或0等。
四、编码和加密二进制数的表示方法可以用来进行编码和加密。
例如,ASCII码就是一种将字符映射为二进制数的编码方式。
通过不同的编码方式,我们可以将字符、文字、图像等转换为二进制数进行存储和传输,实现数据的压缩和保护。
五、图像处理图像可以用二进制数来表示,每个像素点的颜色可以用二进制数的不同位来表示。
通过对图像的二进制数进行处理,我们可以实现图像的变换、滤波、增强等操作,从而得到不同效果的图像。
六、控制系统二进制数的表示方法可以用来控制各种系统,如电子设备、机器人等。
通过对二进制数的操作,我们可以实现对系统的控制和调节,如开关控制、速度调节、位置控制等。
七、算法设计在计算机科学中,很多算法的设计和实现都与二进制数息息相关。
例如,排序算法、查找算法、图算法等都可以通过对二进制数的操作来实现。
通过对二进制数的运算和变换,我们可以解决各种实际问题。
二进制中第一位0代表正;1代表负我知道,但是给你一个二进制的数比如101那么转化成十进制应该是多少 5 但不是说首位为1应该是负的吗?谁能给我讲讲这个首位什么时候作为符号,什么时候作为数字去计算什么时候可以直接计算,什么时候需要取反我怎么知道它是正数还是负数如果你有这种疑问,那就是没有高清概念有问题,我们只有在说计算机处理数时,会用0和1代表正负,这种数称之为机器数(包括原码,反码,补码);一:表示法:1、正数5的表示法假设有一个int 类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 000001015转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
2、负数-5的表示法现在想知道,-5在计算机中如何表示在计算机中,负数以原码的补码形式表达。
二、概念:1、原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
比如00000000 00000000 00000000 00000101 是5的原码。
00000000 00000000 00000101 是-5的原码。
备注:比如byte类型,用2^8来表示无符号整数的话,是0 - 255了;如果有符号,最高位表示符号位,0为正,1为负,那么,正常的理解就是-127 至+127 了.这就是原码了,值得一提的是,原码的弱点,有2个0,即+0和-0(和00000000);还有就是,进行异号相加或同号相减时,比较笨蛋,先要判断2个数的绝对值大小,然后进行加减操作,最后运算结果的符号还要与大的符号相同;于是,反码产生了。
2、反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反[每一位取反(除符号位)]。
取反操作指:原为1,得0;原为0,得1。
(1变0; 0变1)比如:正数00000000 00000000 00000000 00000101其反码还是00000000 00000000 00000000 00000101负数00000000 00000000 00000101其反码则是。
二进制数序列-概述说明以及解释1.引言1.1 概述概述部分的内容:在计算机科学和信息技术领域中,二进制数是一种重要而基础的数学表示方法。
它由两个数码0和1组成,是一种仅用两个不同数码表示数字的系统,被广泛应用于数字通信、计算机编程和数据处理等领域。
二进制数的序列由一串0和1的数字组成,通过这种表示方法,我们能够更好地理解和运算任意复杂的数据。
二进制数的表示方法和其他进制不同,它采用了基数为2的系统。
每个数位上的数字只能是0或者1,这与我们常见的十进制数不同,十进制数中可以使用0到9的数字表示。
从二进制数的基本概念到具体的表示方法,我们将在接下来的章节中一一展开。
二进制数在计算机科学中的重要性不可忽视。
计算机的内部数据处理和存储都是以二进制数的形式进行的,因此理解二进制数非常关键。
同时,二进制数也是计算机编程中的重要基础,了解二进制数的表示和运算方法能够帮助我们更好地处理数据和编写高效的程序。
本文将以简明扼要的方式介绍二进制数的基本概念和表示方法,并探讨二进制数在计算机领域中的应用。
通过阅读本文,读者将能够对二进制数有一个清晰的认识,并进一步了解二进制数的重要性和用途。
接下来的章节将详细介绍二进制数的概念、表示和应用,以帮助读者更好地理解和运用二进制数。
1.2文章结构文章结构部分的内容可以是以下内容:文章结构是指文章的整体组织架构,包括引言、正文和结论三个主要部分。
在本篇文章中,我们将介绍二进制数序列的相关概念和表示方法,并探讨二进制数在计算机中的重要性和应用。
引言部分是文章的开端,它主要包括对二进制数序列主题的概述、文章结构的介绍以及写作目的的阐述。
在本篇文章中,我们将首先概述二进制数的基本概念,然后详细介绍二进制数的表示方法。
最后,我们将探讨二进制数在计算机中的重要性和应用。
正文部分是文章的主体部分,主要围绕二进制数的基本概念和表示方法展开。
在2.1节中,我们将详细解释二进制数的基本概念,包括二进制数的定义、特点和基本运算。
11011的二进制1.引言1.1 概述概述部分的内容应该介绍11011的二进制表示的背景和基本概念。
可以包括以下要点:11011是一个五位的二进制数,由0和1组成。
在二进制系统中,每一位的权值为2的幂,从右向左依次为1、2、4、8、16。
二进制是一种常用的数字表示方法,特别在计算机领域中使用广泛。
它只使用两个数字0和1来表示数值,与我们通常使用的十进制(使用0-9的十个数字)有所不同。
因为计算机内部的数据是以二进制的方式存储和处理的,所以了解和理解二进制的表示方法非常重要。
11011的二进制表示可以看作是一个二进制数,其中每一位的值表示该位对应的权重值,与该位上的1的个数无关。
在11011中,最右边的一位代表2^0,即1;接着是2^1,即2;然后是2^2,即4;接着是2^3,即8;最左边的一位代表2^4,即16。
了解11011的二进制表示有助于我们理解二进制系统和进行进一步的数值计算与转换。
在本文接下来的章节中,我们将继续讨论11011的二进制转换以及相关的应用和概念,以加深对二进制表示方法的理解。
1.2文章结构文章结构部分的内容:文章结构是指文章整体的组织和布局方式,是确保文章逻辑严密、条理清晰的基础。
本篇文章的结构包括引言、正文和结论三个部分。
引言部分是文章的开篇,旨在引入话题并简要介绍文章的内容。
在引言中,我们将概述本文的主题和目标,以及准备进行的正文内容。
引言的写作需要概括扼要,给读者一个整体的了解,引起读者的兴趣。
正文部分是文章的主体,用来详细阐述11011的二进制。
该部分将包括两个小节,分别是11011的二进制表示和11011的二进制转换。
在这两个小节中,我们将详尽地解释11011在二进制中的表示和相应的转换方法。
2.1节“11011的二进制表示”将介绍11011在二进制中的表示方法。
我们将解释二进制是如何工作的,以及如何用0和1来表示不同的数字,进一步讲解11011这个特定数字在二进制中的表示方式。
0,16,2进制的互相转换所谓16进制,就是由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16个数字组成。
逢16进⼀位,下⾯就讲讲在没有任何⼯具的情况下如何将⼀10进制转化为16进制:1000除以16得62余8,那么最低位为8,再将62除以16得3余14,那么倒数第2为E(14对于16进制来说是E),3⽐16⼩了,所以不⽤继续除了,总的就是3E8,为1000的16进制数。
想要将16进制的数转化为10进制,只需将上⾯的步骤反过来做就可以了。
不⽤我多说吧!2进制仅由0、1两个数字组成,逢1进⼀。
要将⼀10进制化为2进制,介绍⼀个简单的⽅法,先将10进制的数化为16进制,再化为2进制,举个例⼦:515对应16进制为203H,将203转为2进制则为0010(2) 0000(0) 0011(3),⼀个位数对2进制来说是4个字符。
0H就是0000、1H就是0001、……、0EH就是1110、OFH为1111,⼤家可⾃⼰推⼀下。
总之⼤家⼀定要熟练掌握各个进制的互相转化,尤其是100以内10--16和16--10的互相转化要记住。
16-10H、32-20H、48-30H、64-40H、80-50H、96-60H、100-64H,255-FFH,65535-FF FFH,1677万-FF FF FFH,前为10进制,后有H的为16进制,这些能记住,以后修改就⽅便许多了。
⼆进制⼆进制是逢2进位的进位制,0、1是基本算符。
现代的电⼦计算机技术全部采⽤的是⼆进制,因为它只使⽤0、1两个数字符号,⾮常简单⽅便,易于⽤电⼦⽅式实现。
⼆进制四则运算规则 加法 0+0=0,0+1=1+0=1,1+1=10 减法 0-0=0,1-0=1,1-1=0,0-1=-1 乘法 0×0=0,0×1=1×0=0,1×1=1 除法 0÷1=0,1÷1=1⼀、什么是⼆进制 在现实⽣活和记数器中,如果表⽰数的“器件”只有两种状态,如电灯的“亮”与“灭”,开关的“开”与“关”。
16位二进制补码表示数的范围在计算机科学中,二进制补码是一种常用的表示有符号整数的方式。
16位二进制补码可以表示的范围是从-32768到32767,其中包括了0。
接下来,我们将详细解释这个范围的含义以及它在计算机中的应用。
我们需要理解什么是二进制补码。
在计算机中,数字被表示为二进制(0和1)的序列。
有符号整数通常使用最高位作为符号位,0表示正数,1表示负数。
而二进制补码是通过将负数表示为其绝对值的二进制表示形式加上1来实现的。
这种表示方法使得计算机在进行加法和减法运算时更加高效。
现在,我们来看一下16位二进制补码可以表示的范围。
最高位用来表示符号,因此有15位用于表示数值。
对于无符号数来说,这15位可以表示0到32767的范围。
但对于有符号数,最高位用来表示符号位,因此只剩下14位用来表示数值。
这样,16位二进制补码能够表示的范围就是从-32768到32767。
在实际应用中,16位二进制补码可以用于处理各种计算机程序中的整数数据。
例如,在计算机游戏中,角色的坐标位置可以使用16位二进制补码来表示。
这样可以节省存储空间并提高计算速度。
此外,16位二进制补码还可以用于表示传感器数据、温度、速度等各种实际物理量。
在进行16位二进制补码的运算时,需要注意一些细节。
首先,当进行加法或减法运算时,需要将两个数的补码相加或相减,并对结果进行溢出检查。
如果结果超出了16位的范围,则需要进行溢出处理。
其次,在比较大小时,需要注意符号位的影响。
负数的补码的最高位为1,而正数的补码的最高位为0,因此要正确比较大小,需要考虑符号位。
总结来说,16位二进制补码表示数的范围是从-32768到32767,其中包括了0。
它在计算机科学中被广泛应用于表示有符号整数,并在各种计算机程序和应用中发挥重要作用。
对于计算机科学的学习和理解,了解二进制补码的表示方式是非常重要的。
通过深入理解16位二进制补码的范围和应用,我们可以更好地理解计算机中整数的表示和运算方式,从而提高程序的效率和正确性。
如有帮助,欢迎下载支持 1 -整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。 一个很基本的想法是,我们先判断整数的最右边一位是不是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; }
return count; } 可能有读者会问,整数右移一位在数学上是和除以2是等价的。那可不可以把上面的代码中的右移运算符换成除以2呢?答案是最好不要换成除法。因为除法的效率比移位运算要低的多,在实际编程中如果可以应尽可能地用移位运算符代替乘除法。 这个思路当输入i是正数时没有问题,但当输入的i是一个负数时,不但不能得到正确的1的个数,还将导致死循环。以负数0x80000000为例,右移一位的时候,并不是简单地把最高位的1移到第二位变成0x40000000,而是0xC0000000。这是因为移位前是个负数,仍然要保证移位后是个负数,因此移位后的最高位会设为1。如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。 为了避免死循环,我们可以不右移输入的数字i。首先i和1做与运算,判断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; 如有帮助,欢迎下载支持 2 } return count; } 另外一种思路是如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减去1,那么原来处在整数最右边的1就会变成0,原来在1后面的所有的0都会变成1。其余的所有位将不受到影响。举个例子:一个二进制数1100,从右边数起的第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成1,而前面的1保持不变,因此得到结果是1011。 我们发现减1的结果是把从最右边一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000。也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。 这种思路对应的代码如下: int NumberOf1_Solution3(int i) { int count = 0;
while (i) { ++ count; i = (i - 1) & i; }
return count; } 扩展:如何用一个语句判断一个整数是不是二的整数次幂? PS:n&(n-1)==0;//二进制数只有一位位1,则该数是2的整数次幂.
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。 分析: 首先想到的方法应该就是通过取余、作除来转换为二进制,进而求的整数中1的个数。但是该方法存在一个问题:即如果该整数位负数,如-7,则求的结果实际是正7的二进制形式中1的个数。我们可以考虑另一种方法,依据如下: xxx1000 &(xxx1000-1)=xxx0000 即整数n-1会使得该整数的二进制形式中最后一个1变为0,而该1之后的所有位变为1,然后再与n做与操作,即可将该位置0,也即会把该整数最右边一个1变成0。这样,整数的二进制形式中有多少位为1,就可以进行多少次这样的操作,进而求出该整数的二进制形式中有多少个1.而负数在计算时会被转换为补码,同样可以计算出二进制中1的个数。 参考代码:
#include 如有帮助,欢迎下载支持 3 #include int count1InNum(int num) { int result=0; while(num!=0) { num &=(num-1); result++; } return result; } //此方法如果num为负数,比如-7,则求的1的个数实际是7的二进制形式中1的个数 int count(int num) { int result=0; while(num!=0) { if(num%2!=0) result++; num /= 2; } return result; } int main() { int num; scanf("%d",&num); while(num!=0) { char s[33]; itoa(num, s, 2); printf("The number of 1 in %d (%s) is %d.\n",num,s,count1InNum(num)); printf("The number of 1 in %d (%s) is %d.\n",num,s,count(num)); scanf("%d",&num); } getchar(); return 0; }
运行结果举例: 如有帮助,欢迎下载支持 4 统计一个整数n的二进制表示中1的个数 统计一个整数n的二进制表示中1的个数; 分析:此题有多种解法. 1. 除2取余法:求一个整数的二进制的表示是,用的方法是除2取余。对于本题,只是统
计一下余数为1的个数而已。 2. 位模式法+移位:1的变种,用移位代除2,该方法更高效。用位模式,与1相与,取得
一位。 3. 模式位法: n = n& (n -1); 考虑 n 与 n -1的二进制表示,两者相&, n-1总能将n的最低
位的1,置0. 4. 分而治之法:分析,n的二进制表示中位为1的位中1,还可以表示该位的1的个数为1。
基于这个计数的性质。 要求一个n位的整数的二进制的表示中1的个数: (1).若n为1,返回该位的值;即该位上1的个数; (2) 若n>1时,等于其前n/2位中1的个数+后n/2位中1的个数;
具体实现代码及其测试如下: //采用分而治之的方法统计n的二进制表示中1的bits int countBitsOf1(int n) { n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); //2bits一组,用2bit表示这个2bit中1的个数 n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); //4bits一组 n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); //8bits组 n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); //16bits组 n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); //32bits组 return n; } //统计n的二进制表示中1的个数:模2取余法 int numOfOnes_0(int n) { unsigned m = (unsigned)n; int count = 0; while(m) { if(m%2) ++count; m /= 2; } return count; 如有帮助,欢迎下载支持 5 } //统计n的二进制表示中1的个数:模2取余法的变种,模式位+移位法 int numOfOnes_1(int n) { unsigned m = (unsigned)n; int count = 0; while(m) { if(m & 1) ++count; m >>= 1; } return count; }
//统计n的二进制表示中1的个数:模式位法:n&(n-1) 总能将n的最右边的1置0; int numOfOnes_2(int n) { int count = 0; while(n) { ++count; n = n & (n-1); } return count; }
将一张圆饼分成八等份,最少需要几刀?(可以任意折叠这张面饼)
3个人3天用3桶水 9个人9天用几桶水? 数学智力题:移动一根火柴使公式成立