计算机中的进制
在学习编程的过程中,经常见到二进制,十进制,十六进制,到底进制表示什么意思呢?进制,字面意思,前进的制度,在数字方面,就是数字前进的制度,数字怎么向前进,那就是进位,我们在做加法运算的时候都会用到进位,8+3,我们会写个1,然后向前进一位,数数的时候更是如些,1,2,3......10, 我们不会再向下数11,12 ..... ,而是在心中放一个1, 然后再1,2,3,4,......10, 到10之后, 我们也不会向下数,而是在心中再记一个1,那么心中的数字就是2了,继续向下数,1,2,3,数完了,没有到10, 我们就直接记下3,最后统计一下,心中的2乘以10,再加上3,就是23。数数的时候,到了10,就会进一位,做加法运算的时候,到了10,也会向前进一位,这就是进制,前进或进位的制度, 它只是 我们的一种记数法则。到了10就会向前进一位,简化一下,就是十制,这不就是十进制了,逢十进一的制度,那么其它的进制就很好说了:
二进,到了2就向前进一位,那也就是逢二进一,就是二进制,它只有0和1;
八进,到了8就向前进一位,逢八进一,就是八进制,只能用0-7 进行表示;
十六进:到了16就进一位,逢十六进一,就是16进制,但是我们平时只有0-9 这些数字,怎么能表示16,超出的10部分是用字母代替,如A表示的是10, b表示11, 大小写都可以
进制说完了,但这里遇到了一个问题,如果写一个数字21, 它是几进制,八进制,十进制? 所以还需要在表现形式上进行一下区分,在计算机程序语言中,默认是十进制,也就是说,如果什么都不表示,这个数就是十进制表示的数,八进制则是加前缀0(这是在java中,在 ES6中则是加前缀0o), 十六进制加前缀0x或0X,如0X21。
这时基本上就明白了,所谓的进制,只不过是一种计数方式,二进制,八进制,十进制,十六进制等,只不过是一个数的不同的表现形式。举个简单的例子,就是上面的21好了,用二进制表示21是10101, 8进制表示则是025, 16进制则是0x15.
为什么会出现二进制,这要从早期的计算机说起,计算机在早期的时候存储的是电信号,电信号就是我们所说的开关。开关,开关,它当然只有两种状态,开或关,到后来就演变成了计算机中的0,1,所有的数据都以0,1进行表示。最后,国际标准化组织决定以8个二进制位为一组来表示数据,这就是所说的字节byte,字节成为了表示数据的最小单元。一个字节由8个二进制位组成,一个二进制位为一个bit 位。 最小单元表示,无论数据有多小,我都用一个字节来表示,比如写一个0, 它完全可以用一个二进制位bit来表示,但不行,由于最小单元的存在,还是用8个二进制位表示,它在内存在占一个字节。 可以用记事本验证一下,在桌面上新建一个txt文件,右键单击,选属性,可以看到它的大小是0个字节;这时打开记事本,输入一个0,保存并关闭,再右键属性,可以看到它的大小是1个字节。
我们发现在计算机中用二进制来表示一个数,非常长,因为8个二进制为一组。如上面的21, 最为正确的表示方式为 00010101, 这非常的不方便,所以后面的人决定以3位为一组进行表示,所以就出现了八进制。上面的8个二进制位可以表示为 000 010 101,当然前面补了一个0, 后面3位101 表示8进制的5, 前面的010 表示8进制中的2,所以八进制表示为025, 后面还有人说三位也有点长,那就四个为一组进行划分0001 0101, 这就是所谓的十六进制,后面的0010在十六进制表示5,前面的0001 表示1, 所以16进制为0x15.
那么为什么三位为一组就是8进制,四位为一组就是16进制呢? 这还是要从它们的定义说起,八进制,逢八进一。我们来看一下三个二进制位表示的最大数和最小数就知道了,3个二进制位最小数为000, 肯定是0, 最大数111, 它是7, 所以三个二进制位表示的数字范围为0~7,很显然,如果再加1个二进制位,它就要向前进1了,逢八进一,八进制。同理,四个二进制位的最小值 为0000,它是0,最大值为1111,为f,也就是15, 再大一位,就变成了16,它要向前进1了,逢十六进一,所以是十六进制。
对一个数可以进行二进制操作,&(按位与), |(按位或), &(按位异或),~(反码),<<(左移), >>(按右移), >>>(无符号右移)。对数进行二进制操作,就是先把数转化成二进制表示,然后对二进制数进行操作。
&(按位与): 两个二进制数(按位与),只要两个数都是1,结果是1,否则全是0。0&0=0; 0&1=0; 1&0=0; 1&1=1; 按照计算规则,计算一下 6 & 3. 先把 6 和3 分别转化成 二进制数表示。在JavaScript 中 ,进行位运算时, 整数都按32位表示, 所以6 的二进制表示为 00000000 00000000 00000000 00000110, 3 的 二进制表示 00000000 00000000 00000000 00000011,如下图所示
从右向左,0&1 = 0, 1&1 = 1, 1&0 = 0, 其他全是0, 得到的结果是 00000000 00000000 00000000 00000010, 十进制是2,6 & 3 = 2. 它有一个作用就是,可以取 一个数的最低(最右边)的有效位。如果用 00000000 00000000 00000000 00000001去& 一个数,可以获取这个数的最低一位, 00000000 00000000 00000000 00000011 去& 一个数,可以获取到这个数的最低两位。00000000 00000000 00000000 00000111 去& 一个数,可以获取一个数最低三位,因为1 & 任何数就是它本身。如果你想获取一个数最低几位,就用几个1去&这个数。