一.十进制与二进制互转
首先理解十进制如何转二进制:将十进制数据除以2直到商为0,然后将余数从下往上排序连接,即可得到该数字的二进制数。
如:整数13
13/2=6余1
6/2=3余0
3/2=1余1
1/2=0余1
取13余数,倒序连接。所以13转化二制为1101
可以用转化工具测试https://tool.lu/hexconvert/
理解十进制如何转换为二进制算法,那我们用PHP代码实现一下
1.
echo decbin(13)
输出结果是1101,这种方法特别简单,但实现原理你知道么?你不知道。。。
你不知道自己写写不就知道了么
$tenChangetwoFun = function ($num = 0){ if($num < 2) { return $num; } $twoArr = []; $shang = $num / 2; $yushu = $num % 2; array_unshift($twoArr, $yushu); while ($shang) { $yushu = $shang % 2; $shang = intval($shang / 2); array_unshift($twoArr, $yushu); } return implode('', $twoArr);};echo $tenChangetwoFun(15);
知道了十进制转二进制了,我们来聊一下二进制转化为十进制
解释一下,解释过程非常重要,要仔细看:
从最低位(最右)算起,位上的数字乘以本位的权重,权重就是2的第几位的位数减一次方。比如第1位:2^(1-1)=1,第2位2^(2-1)=2,以此类推,二进制1101,换算十进制1*2^(1-1)+0*2^(2-1)+1*2^(3-1)+1*2^(4-1)=1+0+4+8=13
用代码实现一下:
echo bindec(1101);
这段代码是不是很简单,虽然简单,但我们也要知道它实现的原理,我们用php代码实现一下:
$twoChangeTenFun = function ($twonum){ $twonum = (string)$twonum; $len = strlen($twonum); $twonum = strrev($twonum); if($len < 1) { return 0; } $total = 0; for ($i = 0; $i< $len; $i++) { $total += $twonum[$i]*pow(2,$i); } return $total;};echo $twoChangeTenFun(1101);
以上是十进制与二进制互转,接下来讲一下十进制与八进制互转
二.十进制转八进制
十进制转八进制跟十进制转二进制原理一样,如图:
如:整数130
130/8=16余2
16/8=2余0
2/8=0余2
取130的余数,倒序连接,得出202
理解十进制转八进制算法,我们用php代码实现一下
echo decoct(130);
得出结果为202;这段代码是不是也很简单,我们理解一下它的实现原理,用php代码实现一下:
$tenChangeeightFun = function ($num = 0){ if($num < 8) { return $num; } $eightArr = []; $shang = $num / 8; $yushu = $num % 8; array_unshift($eightArr, $yushu); while ($shang) { $yushu = $shang % 8; $shang = intval($shang / 8); array_unshift($eightArr, $yushu); } return implode('', $eightArr);};echo $tenChangeeightFun(130);
惊不惊讶,刺不刺激,是不是跟上面二进制与十进制代码转化一样,对!就是一样的,可以用一套方法,传不同参数就行了。
知道十进制怎么转八进制,来看一下八进制转十进制呢,跟二进制转十进制一样,从最低位(最右)算起,位上的数字乘以本位的权重,权重就是8的第几位的位数减一次方。比如第1位:8^(1-1)=1,第2位8^(2-1)=2,以此类推,八进制202,换算十进制2*8^(1-1)+0*8^(2-1)+2*8^(3-1)=2+0+128=130
最简单代码:
echo octdec(202);
我们在用最复杂的代码实现一下,知道它的实现原理
$eightChangeTenFun = function ($eightnum){ $eightnum = (string)$eightnum; $len = strlen($eightnum); $eightnum = strrev($eightnum); if($len < 1) { return 0; } $total = 0; for ($i = 0; $i< $len; $i++) { $total += $eightnum[$i]*pow(8,$i); } return $total;};echo $eightChangeTenFun(202);
这段代码跟二进制转十进制一样。通过这两个转换,那十进制转十六进制与十六进制转十进制就不详细说明了。