关于进制
关于进制
1.进制为何物?
进制是人类进行计数的计数方式,据说是根据系绳结演化而来的,也有可能是外星人教的,不过这不重要。所谓进制就是为了计数方便,在低位数达到一定数量之后便向高位进一位,用高位的这一位来表示低位的全部计量。如在十进制中,当各位9再加一个1时,那么个位清零,向十位进一位成为10,数字从一个一位数变成一个两位数,十位的1,便代表个位的9加个位的1,而个位0则代表之前的相加结果已经满一个计数单位,于是得到升格,去了十位的位置。所谓十位数就是逢十进一,每一个位的数字达到10之后都要向更高位进一位,本位清零。而其他的N进制数同理,就是逢N进一,如二进制数,便是逢二进一,八进制数是逢八进一,十六进制数是逢十六进一。人类在历史上使用过很多进制的计数法,如我国早期使用二进制,其他国家我也不知道。但总之在后来的某一天,十进制成为了人类的首选,具体原因我也不知道,但在外国人心目中,10确实是个神秘的数字,比如苹果十非不叫苹果十,叫苹果叉儿,i7 6950X最后也加了个叉儿,叉儿就是X,罗马数字中的10。
2.计算机使用什么进行计数以及为何?
计算机使用二进制进行计数,这是因为人类科技树导致的,人类在电路上无法制作出更加丰富多彩的电信号了,因为首先电流是围观的电子因为电压而产生的如水一般的定向流动导致的,通常来讲在导线中的电子分布并不均匀。我们人类自然可以通过电压表和电流表粗略的观察电路某处的电压和电流,但是电路本身并不能够进行这种准确的识别,电路自身只能识别出有电或者没电的区别,我们很难通过一个电路的输出判断哪个电池的电压是多少,但是当只有一个电池进行供电时,我们就能明晰的得到结果,也就是说,电路可以比较明确的区分出有电和没电,但是难以区分出谁电多谁电少。因此,人类在设计数字电路时采用了高低电平的时序输入,这一串高低电平在输入后可以得到一串符合时序的反馈,然后人们发现这是有规律可循的,不同的数字电路可以得到相应的反馈,不同的输出也可以得到相应的反馈,因此使用是数字电路进行信息控制的时代就开始了,知道计算机的大规模集成电路的出现,在本质上计算机还是由数以亿计的数字电路构成的,因此计算机实际上是一个超大规模功能超多的数字电路,它底层还是使用的高低电平加时序作为信息传递的方式。
因此,物理上的高低电平我们怎么表示呢,就是0和1,而时序呢?就是所谓的频率。在早期人类使用01代码作为机器语言来记录想要输入的电平信息,即使后来出现了汇编语言,汇编指令的对应操作,仍然是被称为操作码的机器语言,而之后的C语言是对汇编语言的集成,再后来的Java,Python语言则是对C语言的集成,因此,不管计算机怎么发展,界面怎么花里胡哨,其底层的信息,仍然是机器语言,其信息的内部表示与记录,让然是用的二进制。
3.二进制
二进制就是逢二进一的计数方式,每一位的最大数字就是1了,只要发生1加1的情况,就要向下一位进位,如二进制1+1 = 10,这个二进制10其实就是我们人类喜欢的十进制中的2,而10+1为11,此为二进制中的3,11+1为100,此为二进制中的4...
在计算机中我们能表达的数字其自身底层表示方式就是二进制的,而计算机的能力是有限的,因为记录二进制数字的信息也是需要代价的,CPU一次能进行运算的二进制大小也是有限制的,这个限制来源于构架中的数据宽度,我们现在通常使用的电脑都说是64位电脑,64位系统,而64位系统的安装需要计算机硬件的支持,必须CPU是64位的,才可以装64位的系统,这里CPU是64位其实就是其内部的数据总线一共有64根,CPU最多一次表示64位的二进制信息,而其最多的一次运算也只能最高支持到64位的二进制数,不过你不要担心,数字的表示方式其实是根据数学中的排列组合来确定表示数字数量的大小的,二进制的64位其实就是可以表示2^64个数字,这个数字是相当不小的,因此从目前的来说也是够用了。64位的硬件支持自然支持低位的数字上限,它可以传输8位的二进制数,16位的二进制数,32位的二进制数,64位的二进制数,但是传输不了128位的二进制数。
4.传统的进制转化
1.二进制转化为十进制
如10011011转化为十进制的方式为:1 * 2^0 + 12^1 + 0 * 2^2 + 12^3 + 1 * 2^4 + 0 * 2^5 + 0 * 2^6 + 1 * 2^7,为1+2+0+8+16+0+0+128 = 155。也就是从右往左,每一位都乘2的第n位次方并相加。
2.十进制转化为二进制
十进制转化为二进制的方法为,十进制数字不断的除以2,并得到每次的余数,最终除到0,所有的商从最新运算到最老运算的方向排布,横向从左往右的排布便是转化完成的二进制,这么说有些抽象,接下来我举个例子:
452(十进制)----->二进制
452 / 2 = 226 ...... 0 ^
226 / 2 = 113 ...... 0 |
113 / 2 = 56 ...... 1 |
56 / 2 = 28 ...... 0 |
28 / 2 = 14 ...... 0 | 排列方向为由下至上,因此结果为:1 1100 0100
14 / 2 = 7 ...... 0 |
7 / 2 = 3 ...... 1 |
3 / 2 = 1 ...... 1 |
1 / 2 = 0 ...... 1 |
这里实验一下,我们根据011000100得到的数字为:0 + 0 + 4 + 0 + 0 + 0 + 64 + 128 + 256 = 452。
3.八进制转化为十进制
八进制转化为十进制的方式参考二进制转化为十进制,如八进制数:237,应有 7 * 8^0 + 3 * 8^1 + 2 * 8^2 = 7 + 24 + 128 = 159。
4.十进制转化为八进制
十进制转化为八进制的方式参考十进制转化为二进制的方式,同理,是不同的除8然后求余数,将每次得到的余数,按照和二进制一样的排布,即最新的从做开始,往右排。
267(十进制)----->八进制
267 / 8 = 33 ...... 3
33 / 8 = 4 ...... 1
4 / 8 = 0 ...... 4
因此结果是413,3 * 1 + 1 * 8 + 4 * 64 = 267,验证成功。
5.n进制转化为十进制
由上面我们可以推出n进制转化为十进制的方式,为n进制数从右往左依次乘这个进制的0次方到总位数次方再相加,用公式表示为:
ahdfgu(n进制数,共有6位) ---> 十进制
u * n^0 + g * n^1 + f * n^2 + d * n^3 + h * n^4 + a * n^5
其实就是和二进制的方式进行类比
6.十进制转化为n进制
十进制转化为n进制的方式也是桶十进制转化为2进制类似,就是不断的除以进制数n,并得到余数,将新获得的余数放在左边,依次排布即可。
2542(十进制) ---> n进制
2542 / n = y ... q
y / n = z ... w
z / n = x ... e
e / n = 0 ... e
n进制数为:eewq
7.总结
通常情况下这种传统的进制转化方式就够用了,一般在写程序时也经常使用到这种传统的进制转化方式,然而使用这种进制转化方式在进行m进制转n进制时会有一些局限,因此这里先到此为止,之后我会记录一个更加灵活先进的进制转化方式。详情点击链接跳转。