二进制感悟(进制学习这一篇就够了)
进制:就是进位制,是人们规定的一种进位方法。对于任何一种进制——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中进制表示
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为:
所以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为:
所以15|10=15。
1.3 取反运算:~取反运算的操作符为~,取反。即:~1=0;~0=1.
比如计算~10,首先10的二进制为:1010,~10为:
~10=5。
1.4 异或运算:^异或运算的操作符为^。相同为0,不同为1。即:1^1=0;1^0=1;0^0=0.
比如计算15^10,首先15的二进制为:1111,10的二进制为1010,所以15^10为:
所以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