2023年1月19日 19点15分 JP
进制的本质是什么?#进制就是一个位所能表示的数的范围,比如我们的十进制,每个位所能表示的数的范围只能是0~9。每个位都有其对应的权重,比如十进制的各位权重是1、十位权重是10、百位权重是100…
某进制(n进制)的本质是,其只有n个符号用来表示自然数。比如十进制的这10个符号就是0~9、十六进制的16个符号中前十个与十进制一样是0~9,后六个是A~F分别代表数值10~15、八进制的八个符号是0~7表示数值0~7、二进制的两个符号是0和1也代表的数值0和1。
如果你愿意,十进制不一定非得写0123这些数字符号,因为它们本身只是一种符号,我们人为的赋予了它们数值的意义并以此为习惯。但其实我们完全可以用其他符号来定义数值的大小比如字母甚至我们自己乱花的符号。例如我们可以规定A的意义是数值0、B的意义是数值1,以此类推就可以用A~J分别表示数值0~9,这个时候我们的数值11就是写成BB、数值99写成JJ…
什么是权重?#拿我们十进制来举例,十进制的数:83512,读作8万3千5百1十2,从小我们就知道从右到左,这五个位分别是个位、十位、百位、千位、万位,这里的个十百千万就是权重。
权重的大小#我们知道每个位上数字符号所代表的实际数值大小其实是符号本身的数值乘上其位的权重。例如83512中5所代表的数值是500并不是5本身,为什么是500而不是50或5000呢,因为他所在的位的权重是100。每个位的权重大小应该是多少呢,可能我们习惯性的认为是每往左一个位(每高一个位)就多乘10,这是没错,但其本质是10的幂。每个位都有其索引,比如个位的索引是0、十位是1、百位是2…那么每个位的权重就是其10的索引次幂:个位是10^0=1、十位10^1=10、百位10^2=100…同理:n进制数的m位权重为n^m,注意我们这里所说的m,是位的索引,其是从0开始的,但是日常中我们会说第一个位(个位)或者第二各位(十位)…不可将两个弄混淆
十六进制的权重大小#0位:16^0=11位:16^1=162位:16^2=2563位:16^3=4096…例如十六进制数:0x4321(一般我们会用0x前缀或者h后缀来表示某个数是十六进制),从最低位开始,其值分别为1、2\*16、3\*16^2、4\*16^3。(整个数的数值大小就是这四个数值的总和)
二进制的权重#0位:2^0=11位:2^1=22位:2^2=43位:2^3=84位:2^4=165位:2^5=326位:2^6=647位:2^7=128…其中3位是8,为16的一半;7位是128,为128的一半,为什么要提这个呢,他有什么特殊的地方吗?还真有,我们后面再讲。
位宽是什么#什么是位宽呢,其实很简单,有几个位就是多少位宽,比如我们十进制的500,500占了三个位,这就是位宽3位。位宽能获得什么信息呢?位宽限制了一个数值的最大值,就拿位宽3来说,三个位的十进制数,其最大值只能是999。再换个角度来说,位宽也决定了这组符号所能表示的数值范围,还是3位宽,其值只能是0~999,那么其涵盖的数值范围大小就是1000个,也就是说3位十进制数所能承受的可能性是1000种,这1000种可能是0~999中的其中一个。再来思考一下,1000是什么?1000刚好是下一位的权重值,也就是第四位:千位(索引为3的那位),其权重为10^3刚好就是1000。同理,我们可知,n位宽所能表示的可能性是其高一位的权重值,也就是10^n,当然n位宽所能表示的最大数值是10^n-1。同样的道理,n位宽的x进制数,其所能表示的可能性有x^n种。
二进制与十六进制间的奥秘#我们再来看十进制500这个数,我们看一眼都知道这是1000的一半,但是为什么呢?因为5刚好是10的一半,所以500也是同样的道理,0~499是前500种可能,500~999是后一半500种可能。 那十六进制呢,聪明的我们肯定也是一下就明白了,8是16的一半,所以最高位是8就代表进入另一半可能了。比如0x80,前一半的可能性是0~7F,后一半的可能性就是80~FF。那么二进制呢?当然是数字1啦,最高位是1即代表以及进入后一半可能了,是后一半可能中的第一个(前一半可能中的第一个是0)。我们的思路再次回到上面二进制权重的地方,还记得二进制3位和7位的权重分别是8和128吗?其写出来就是1000与1000 0000,有没有什么灵感出现?对于二进制数,位宽4的表示范围是8\*2=16,位宽8的范围是128\*2=256。而这两个值,16和256同时也是1位宽与2位宽16进制数的表示范围,即1个16进制数与4个二进制数是等效的(1hex=4bits),我们都知道在计算机中,1个字节是8位(bit),所以一个字节可以用8位宽的二进制位数来表示,但也可以用2个16进制位来表示(1Byte=8bits=2hexs**)。总结:每个16进制位都与4个二进制位一一对应,即二进制和十六进制位是可以相互转换的,因此十分建议大家记熟16进制位所对应的2进制位是多少,这对于整个计算机的学习后益无穷。
hex与bit的对应表#hexbithexbit0000081000100019100120010A101030011B101140100C110050101D110160110E111070111F1111换个角度看字节#通过上面的叙述,我们是不是可以从另一个角度来看待字节呢,计算机中存取的基本单位是字节,也就是说我们的数据量是建立在字节这个基础之上的,我们可以操作1个字节、2个字节、4个8个…无数个。此时字节这个单位的本质是什么?是进制,什么进制呢,是256进制!一个字节的数据内容就是256种可能中的一个,两个字节就有256*256种可能,4个字节就有256^4种可能。从这个角度来看,字节的本质其实就是进制,n个字节的数据合起来看,其本质就是n位宽的256进制数。同理KB/MB/GB/TB或者WORD/DWORD/QWORD都可以看成一种很高的进制。
进制的运算#每个进制都是独立,所以二进制或者16进制的运算并不是要先转成10进制,进行运算后,再将结果转回原来的进制,这样的步骤是十分多余的。任何一种进制,它本身都可以独立运算,而这个运算其实很简单,就只有两个基础操作:一个是掐手指,一个是乘法表。其中掐手指用来计算加减法,而乘法表用来计算乘除。
什么是掐手指?#所谓掐手指其实就是往后查符号,比如我们小时候计算3+5时是怎么做的呢,就是3开始往后掐5个指头(查5个符号),我们从3开始一个一个掐手指:4、5、6、7、8,掐了五个手指时,对应的符号是8,哦原来答案是8。其实这个过程的本质就是3这个符号往后查5个符号,也就是8这个符号。由上文可知,每个进制的本质就是符号,因此无论哪种进制,都可以用这种方法来进行加减运算。如果加的数很大,手指掐不过来怎么办?其实这也很简单,聪明的我们肯定也想到了,那就是掐脚趾、掐别人的手指和脚趾!开玩笑的啦,其实和十进制一样,我们后来学了列竖式用来进行加减法运算,而列竖式的本质实际上就是每个位分别查符号,因此无论那种进制,我们一样可以在脑海里列出竖式,然后从低位开始,依次查数(并对应的进行进位与借位)。
进制的乘除运算#我们之所以能够进行十进制的乘除法运算,是因为在我们的脑海里早就根深蒂固的掌握了99乘法表,什么是99乘法表,其本质就是两个符号相乘后所对应的符号,比如符号2和符号8对应的符号就是1 6这两个符号的结合16。所以如果当我们掌握了n进制的nn乘法表,那么我们就可以进行口算乘除,当然太大的数一样是在脑海中列竖式,其本质和加减法竖式一样,也是每个位分别查表(并进行对应的进位与进位),只不过加减竖式查的是有序排列表,乘除竖式查的是nn乘法表,就是这么简单!当然我们没有必要去背诵16进制乘法表,毕竟我们是有计算器的,当然如果愿意,也是可以去掌握的,毕竟掌握之后的效率要比计算器快很多。
2023年1月19日 20点57分 JP