进位制之间的转化原理(计算机进制转换原理)

2024-08-30 09:50:44

二进制数据是用0和1两个数码来表示的数。它的基数为2, 进位规则是"逢二进一"


八进制, Octal, 缩写OCT或, 一种以8为基数的计数法, 采用0, 1, 2, 3, 4, 5, 6, 7八个数字, 逢八进1。


十六进制(英文名称:Hexadecimal), 是计算机中数据的一种表示方法。它由0-9, A-F组成, 字母不区分大小写。

与10进制的对应关系是:0-9对应0-9; A-F对应10-15;


十进制转二进制decbin(),方法是:除2取余倒着写

方法详细描述:将10进制数字, 除以2, 得到商和余数, 如果商不为0, 继续除以2, 继续得到商和余数, 以此类推, 直到商为0,

然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的2进制。


十进制转八进制decoct(),除8取余倒着写

方法详细描述:将10进制数字, 除以8, 得到商和余数, 如果商不为0, 继续除以8, 继续得到商和余数, 以此类推, 直到商为0,

然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的8进制。


十进制转十六进制dechex(), 除16取余倒着写

方法详细描述:将10进制数字, 除以16, 得到商和余数, 如果商不为0, 继续除以16, 继续得到商和余数, 以此类推, 直到商为0,

然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的16 进制。

十六进制中, 10对应为a、11对应为b、12对应c、13对应d、14对应e、15对应为f(十六进制字母不区分大小写)

实例:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>网页标题</title>
<meta name="keywords" content="关键字列表" />
<meta name="description" content="网页描述" />
<link rel="stylesheet" type="text/css" href="" />
<style type="text/css"></style>
<script type="text/javascript"></script>
</head>
<body>
<?php
      $n1 = 123; //10进制
      $n2 = 0123; //8进制,只有(只识别)0-7这8个数字
      $n3 = 0x123; //16进制,只有(只识别)0-9,A,B,C,D,E,F这16个数字
      echo "<br />n1 = $n1";
      echo "<br />n2 = $n2";
      echo "<br />n3 = $n3";
      echo "<br />n2(8进制形式)" . decoct($n2) ;
      echo "<br />n3(8进制形式)" . decoct($n3) ;
/*
方法详细描述:将10进制数字, 除以2, 得到商和余数,
如果商不为0, 继续除以2, 继续得到商和余数, 以此类推, 直到商为0,
然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的2进制。
举例:
$n1 = 123;
123
/2
=61 余1
/2
=30 余1
/2
=15 余0
/2
=7 余1
/2
=3 余1
/2
=1 余1
/2
=0 余1
倒序写出来就是: 1111011
验证如下;
*/
$n1 = 123;
echo "<br />$n1 的2进制形式 为" . decbin($n1) ;
/*
方法详细描述:将10进制数字, 除以8, 得到商和余数,
如果商不为0, 继续除以8, 继续得到商和余数, 以此类推, 直到商为0,
然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的8进制。
举例:
$n1 = 123;
123
/8
=15 余3
/8
=1 余7
/8
=0 余1
倒序写出来就是:173
验证如下;
*/
$n1 = 123;
echo "<br />$n1 的8进制形式 为: " . decoct($n1) ;
/*
方法详细描述:将10进制数字, 除以16, 得到商和余数,
如果商不为0, 继续除以16, 继续得到商和余数, 以此类推, 直到商为0,
然后将上述所有的余数, 取得, 倒序取得排列出来, 就是对应的16进制。
举例:
$n1 = 234;
234
/16
=14 余A(A对应10)
/16
=0 余E(E对应14,14/16,余数仍算是14)
倒序写出来就是:EA
*/
?>
</body>
</html>

二进制转十进制bindec(), 每位数值乘以2的权值然后相加

先理解"权值"的概念:

对于10进制整数, 1234, 其"含义"其实是这样的:

1 * 10^3 + 2 * 10^2 + 3*10^1 + 4 * 10^0 = 1*1000 + 2*100 + 3*10 + 4*1

这里,10^3 10^2 10^1等等, 就称为"权值"

"^"表示次方, 如:2的3次方通常被表示为2^3, 也就等同于2³

对于二进制, 道理同样:

(1100101)2 = 1*2^6+ 1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 64+32+0+0+4+0+1=101

因此二进制数1100101转换为十进制数为101

用系统函数验证如下:

特别注意:

函数bindec()的参数要求是"二进制数字的字符串形式"

八进制转十进制octdec(), 每位数值乘以8的权值然后相加:

(123)8 = 1*8^2 + 2*8^1 + 3*8^0 = 64+16+3 = 83;

十六进制转十进制hexdec(), 每位数值乘以16的权值然后相加:

(12AB)16 = 1*16^3 + 2*16^2 + 10*16^1 + 11*16^0 = 4096+512+176+11 = 4779

A = 10 B = 11

实例:

<?
$n1 = 234;
echo "<br />$n1 的16进制形式为: " . dechex($n1) ;
echo "<hr />";
$n1 = "1100101"; //二进制数字字符串
echo "<br />二进制 $n1 转换为10进制: " . bindec($n1) ;
$n1 = "123"; //8进制数字字符串
echo "<br />8进制 $n1 转换为10进制: " . octdec($n1) ;
$n1 = "12AB"; //16进制数字字符串
echo "<br />16进制 $n1 转换为10进制: " . hexdec($n1) ;
?>


进制转换小结

1 十进制转换为其他3种, 要求是一个"数字":decbin($n), decoct($n), dechex($n), $n是一个数字

转换结果是一个"字符串";

2 其他3种进制, 转换为10进制, 要求是一个该进制的数字字符串:bindec($n), octdec($n), hexdec($n), $n是一个字符串!

转换结果是一个"10进制数字"