二进制感悟(进制学习这一篇就够了)

进制由来

进制:就是进位制,是人们规定的一种进位方法。对于任何一种进制——x进制,就表示某一位置上的数运算时是逢x进一。现在进制的表现一共有四种:十进制、二进制、八进制、十六进制。

十进制:这是因为人类有十个手指头,逢十进一。

二进制:计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示,逢二进一。

八进制:由于二进制写法太长,所以改进成为一个八进制,3位二进制就是八进制(000-111)可以表示(0-7),逢八进一。

十六进制:还是对二进制的改进,4位二进制就是十六进制(0000-1111)可以表示(0-F),逢十六进一。

位数的概念

位(bit): 存储信息的最小单位,表示一个二进制数字,可以是0或者1。字节(Byte):一个字节由8位二进制数字组成(1Byte=8bit),字节是存储和信息组织的基本单位。1K = 1024Byte1M = 1024K1G = 1024M1T = 1024G

因为计算机也是想以10为刻度,计算机底层为二进制,所以内存进制以2^10 =1024。

assicall码、编码及其二进制

assicall码:在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码。ASCII编码使用一个字节就可以完全进行编码,因为只有128种情况。

GBK编码:GBK编码即为我国出版的汉字编码,汉字多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号,GBK编码使用了两个字节。

UTF-8编码:UTF-8编码则是用以解决国际上字符的一种多字节编,它是统一编码,它建立了一个全世界统一的码表。世界上的所有文字,在这张码表中都是唯一的。由三个字节组成。

小结:编码其实都是用二进制来编制的规则表。assicall码是一个字节(因为符号简单)。GBK编码则是两个字节(我国编制的中文编码),UTF-8编码则是国际统一标准码,收纳全世界文字的编码,所以使用了最多的三个编码。

进制转换(只考虑使用正数的补码进行换算)

4.1二进制转换

二进制转八进制:八进制其实就是三位二进制

0101001 –> 101 001-> 051

二进制转十六进制:十六进制其实就是四位二进制

0101001 –> 0010 1001-> 0X29

二进制转十进制:

0101001 –>0*26 1*25 0*24 1*23 0*22 0*21 1*20=41

4.2十进制转换

十进制转二进制:

41/2=20(余数为1) ; 20/2=10(余数为0) ; 10/2=5(余数为0) ;

5/2=2 (余数为1) ; 2/2=1 (余数为0) ; 1/2=0 (余数为1)

41 –> 101001(位数从小到大)

十进制转八进制:

41/8=5(余数为1); 5/8=0(余数为5)

41 –> 051(位数从小到大)

十进制转十六进制:

41/16=2(余数为9); 2/16=0(余数为2)

41 –> 0x29(位数从小到大)

4.3八进制转换

八进制转二进制:三位二进制为八进制

051-> 101 001

八进制转十进制:

051-> 5*81 1*80=41

4.4十六进制转换

十六进制转二进制:四位二进制为八进制

0x29 –> 0010 1001

十六进制转十进制:

0x29-> 2*161 9*160=41

小结:计算机计算和存值都是补码,正数补码是原码。负数补码是原码取反 1。

最高位是符号位:0表示正,1表示负

Java中进制表示

二进制感悟(进制学习这一篇就够了)(1)

Java中的int是32个字节,所以最高位是第32位,这个位决定符号是正还是负。

八进制以0开头,十六进制以0X开头。

二进制计算:最高位如果是1(负数),则需要变为-1进行计算,如果是0(正数),则直接正常计算。

1101…. = (-1) * 231 1 * 230 0 * 229 1 * 228 ….

0101…. = 0 * 231 1 * 230 0 * 229 1 * 228 ….

原码、反码、补码

原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。(最高位是符号位,0表示正数,1表示负数)。

反码:正数的反码还是等于原码。负数的反码就是他的原码除符号位外,按位取反。

补码:正数的补码是其本身,负数的补码是在其反码的基础上 1。(计算机中,数值一律用补码表示和存储的)

小结:正数的原码、反码、补码一样。负数的反码是原码除符号位取反,补码是反码 1

示例:

-2

2

原码

1000 0000 0000 0010

0000 0000 0000 0010

反码(负数符号位不变,其他取反)

1111 1111 1111 1101

0000 0000 0000 0010

补码(负数是反码 1)

1111 1111 1111 1110

0000 0000 0000 0010

备注:其实2是int型,在java中是以4个字节,32位存在的。

二进制位运算

计算机计算和存值都是补码,正数补码是原码。负数补码是原码取反 1。

最高位是符号位:0表示正,1表示负

位运算符有:与 & 、 或| 、异或^、取反~ 、左移位<< 、数学右移位(有符号右移)>> 、逻辑右移位(无符号右移)>>>

1.1与运算:&

与运算的操作符为&。两者为1才为1,否则为0。即:1&1=1;1&0=0;0&0=0.

比如计算15&10,首先15的二进制为:1111,10的二进制为1010,所以15&10为:

二进制感悟(进制学习这一篇就够了)(2)

所以15&10=10。

1.2或运算:|

或运算的操作符为|。一个为1则为1,两者为0则为0。即:1|1=1;1|0=1;0|0=0.

比如计算15&10,首先15的二进制为:1111,10的二进制为1010,所以15|10为:

二进制感悟(进制学习这一篇就够了)(3)

所以15|10=15。

1.3 取反运算:~取反运算的操作符为~,取反。即:~1=0;~0=1.

比如计算~10,首先10的二进制为:1010,~10为:

二进制感悟(进制学习这一篇就够了)(4)

~10=5。

1.4 异或运算:^异或运算的操作符为^。相同为0,不同为1。即:1^1=0;1^0=1;0^0=0.

比如计算15^10,首先15的二进制为:1111,10的二进制为1010,所以15^10为:

二进制感悟(进制学习这一篇就够了)(5)

所以15^10=5。

  • 左移:<<

左移就是将二进制的所有的数字向左移动对应的位数,高位舍去,低位补零

左移将原数乘以2的n次方。

100 << 2

二进制补码:00000000 00000000 00000001 100100 二进制左移2位: 00 | 00000000 00000000 00000001 100100 00解释: | 前面被剔除,后面缺少的两个补0结果:左移两位相当于乘以22, 结果为100 << 2= 100 * 22 = 400

  • 右移:>>

右移就是将二进制的所有的数字向右移动对应的位数,低位舍去,高位补符号位。即正数补0,负数补1

右移将原数除以2的n次方。

100 >> 2

二进制补码: 00000000 00000000 00000000 01100100

二进制右移2位: 00000000 00000000 00000000 00011001 | 00

解释: | 后面被剔除,前面缺少的两个补0,符号位是0则补0

结果: 右移两位相当于除以2,再除以2,结果为100 >> 2= 100 / 22 = 25

  • 无符号右移:>>>

无符号右移就是将二进制的所有的数字向右移动对应的位数,低位舍去,高位补零。

-10 >>> 1

二进制补码: 11111111 11111111 11111111 11110110二进制无符号向右移1位: 0 1111111 11111111 11111111 11111011 | 0

结果:负数进行无符号右移会变为正数。

二进制位运算运用

2.1任何一个数和0异或是它的本身,和自身异或为0。a^0=a ; a^a=0 利用上述性质,可以用来计算2个数的交换。大家应该知道,在计算机里,两个数互相交换,需要定义一个中间的变量来参与交换。如: int tmp; int a=10; int b=20; tmp=a; a=b; b=tmp; 上述代码计算之后,a和b的值完成交换,a的值为20,b的值为10。 如果用异或运算来交换2个数,可以如下方法: int a=10; int b=20; a=a^b; b=a^b; a=a^b; 上述运行之后,a和b依然完成了值的交换,但由于是异或位运算,所以效率比上面的代码要高。 证明:a=10^20b=a^b=(10^20)^20=10^20^20=10^0=10a=a^b=10^20^10=10^10^20=0^20=20

2.2左移( << )不需要考虑最高位补位问题,因为高位会被直接溢出。右移有符号右右移(>>)和无符号右移(>>>),有符号右移最高位要补符号位,无符号右移最高位只需要补零即可。所以无符号右移负数时,会变为正数。

2.3 右移就是原数除以2的n次方。左移就是原数乘以2的n次方。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页