|
发表于 2023-10-2 16:14:15
|
显示全部楼层
我们知道一个数的大小是确定的,其表达形式若有所不同,只是基于不同的计数法则而已。
假设我们大脑最直观的计算法则是基于十进制(DEC),
对于 DEC 数 \({123456}_{10}\),大脑的理解是:\(1*10^5 +2*10^4 +3*10^3 +4*10^2 +5*10^1 + 6\)
对于 HEX 数 \( {123456}_{16}\),大脑的理解是:\(1*16^5 +2*16^4 +3*16^3 +4*16^2 +5*16^1 + 6\)
上面的结果,前者不用计算,还是 \({123456}_{10}\) 保持不变;
后者需要一些乘加运算,最终得到 \({123456}_{16}={1193046}_{10}\)
现在反过来,用大脑计算:上述两数用十六进制如何表达?
显然,\({123456}_{16} = {123456}_{16}\),不用再变换;
而 \( {123456}_{10}={1E240}_{16}\),但过程就麻烦多了,有如下方法:
基础法:\({123456}_{10}=7716*16+0=(482*16+4)*16+0=\dots=(((1*16+14)*16+2)*16+4)*16+0={1E240}_{16}\)
- 分治法:\(16^1=16, 16^2=256, 16^4=65536, \cdots, 16^8\gt123456\)
先转换成\(16^4\)进制,\({123456}_{10} = 1*(16^4)+57920\),从低位向高位排列,得到系数:\([57920, 1]\)将 \(57920\) 和 \(1\)分别转换成 \(16^2\) 进制,得到 \( [[64,226],[1,0]]\)继续,直到转换成 \(16^1\) 进制,得到 \([[[0,4],[2,14]],[[1,0],[0,0]]]\)提取系数,并删除高位连续的\(0\),得到 \({0,4,2,14,1}\)
- 反序,转换成字符串输出,得到 \({1E240}_{16}\),此步骤是个数字与字符映射变换的过程
也就是说,进制变换,
1、若目标进制,是我们当前的计数法则进制,可仅通过乘法+加法变换得到目标字串;
2、否则,需以当前的运算法则为平台,并借助除法,得到得到目标字串。
如果要将一个“7进制”的数转换成“12进制”,该怎么做呢?
在电脑中,可:7进制-->二进制-->12进制;
在人脑中,可:7进制-->十进制-->12进制;
所以,楼主所贴,即 6# 的公式,仅完成了前半部分;
后半部分,需要分治法,也即 Ickiverar 在 3# 所述。
当然,前半部分,也可用到分治法思想,只是步骤与后半部分的正好相反。
后半部分的分治法,需要用到除法,而除法可以转换成乘法,但这已是另一个话题了。 |
|