进制转换相关知识

进制转换

好久都没有好好整理过进制之间转换的关系了。最近在研究 RPC 的内容,有一些理论知识必须要重新整理一下。

由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但是有一些时候,二进制表示的数据实在的太长了,所以我们可能需要一些更高进制的数来表示数据,而我们从小学习的数学,就是以 10 进制来代表的。

进制数越大,所需要数长度就越短。

我们常用的进制有 2、8、16 进制,分别是 2 的 1 一次方,2 的 3 次方,2 的 4 次方。(至于为什么没有 3 进制,4 进制诸如此类的,各位百度一下吧)

进制规则如下:

2 进制,用两个阿拉伯数字:0、1;

8 进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

10 进制,用十个阿拉伯数字:0 到 9;

16 进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了 10 个数字啊?

16 进制就是逢 16 进 1,但我们只有 0~9 这十个数字,所以我们用 A,B,C,D,E,F 这六个字母来分别表示 10,11,12,13,14,15。字母不区分大小写。

十进制转二进制

如果我有一个数字 3,想要转成 2 进制。但是只有 0、1 两个数字,如何表示 3 的呢。所以,这个时候就需要逢二进一,从 2 开始计算。2 的进制是 10,3/2=1,所以就是 11,4 的进制呢,同理:4/2 = 2。所以就从 10 变成了 100。所以是 3 变成 4 的话,就是低位+1.进一位变成 100.

二进制转八进制(从低位起算,每三位二进制数代表一位 8 进制位)

有人会问,为什么每三位二进制代表一个 8 进制位呢,那是因为 2 的三次方是 8 的关系。所以二进制的每 3 位,都要代表 8 进制的进一位。

例如我有(十进制:10)00001010,要转成 8 进制就是 012。

二进制转十六进制(同理转八进制可得,每 4 位二进制数代表一个十六进制位)

例如我有(十进制:10)00001010,要转成 16 进制就是 0xA。

涉及 PHP

在 PHP 当中,需要表示八进制的时候,需要用 0 开头的整数,输出出来的数据会被解析转成十进制的数据。而表示十六进制的时候,需要用到的是 0x 开头

  • 十进制转二进制 => decbin($decVar)

  • 十进制转十六进制 => dechex($decVar)

  • 十六进制转十进制 => hexdec($hexVar)

  • 二进制转十进制 => bindec($binVar)