Excel公式技巧:十进制数转换成指定进制的数

使用公式来解决问题:给定一个十进制的正整数 , 将其转换成指定进制的数 。如下图1所示 , 在单元格A2中是给定的十进制正整数值 , 单元格B2中是指定的进制 , 示例中是4进制 , 单元格C2中是转换后的结果 , 单元格D2中使用公式检验结果是否正确 。

Excel公式技巧:十进制数转换成指定进制的数

文章插图
图1
在单元格C2中的公式是:
=SUMPRODUCT(MOD(FLOOR(A2/B2^(ROW(INDIRECT(“1:20”))-1),1),B2)*10^(ROW(INDIRECT(“1:20”))-1))
在单元格D2中的公式是:
=SUMPRODUCT(B2^(ROW(INDIRECT(“1:” &LEN(C2)))-1),0+MID(C2,1+LEN(C2)-ROW(INDIRECT(“1:” & LEN(C2))),1))
下面来详细解释公式是怎么得来的 。
【Excel公式技巧:十进制数转换成指定进制的数】对于任何进制的数来说 , 其通用形式为:
Excel公式技巧:十进制数转换成指定进制的数

文章插图
图2
其中 , x代表进制数 , a0、a1、a2、…、an是常量 。
例如 , 对于我们熟悉的10进制来说 , 整数173可以表示为:
(1X100)+(7X10)+(3X1)
也可以写作:
(1X10^2)+(7X10^1)+(3X10^0)
我们可以很容易地分解成这样的表达式 , 但是我们如何指示Excel这样做呢?我们可以给出什么指令 , 以便在给定诸如值173的情况下 , 可以生成一系列的返回值 , 即1、7和3分别对应于10^2、10^1和10^0的系数?我们所需要做的就是以某种方式找到一种将值173转换为1个“百” , 7个“十”和3个“一”的方法 。
我们一般采用以下方式推导:
在173中有1个“百” 。
减去1个“百”后 , 余下的73有7个“十” 。
再减去7个“十”后 , 余下的3有1个“一” 。
这些都是非常基本的东西 。当然 , 我们可以在Excel中像上面一样简单地生成等效的算法过程 。唯一的麻烦是 , 上述算法中的每一行都依赖于前一条 。也就是说 , 我们要这样进行设置:
Excel公式技巧:十进制数转换成指定进制的数

文章插图
图3
如果尝试将上图3所示工作表中的尝试压缩为一个公式可能有困难 , 因为列D中的每个公式都包含对其上一行的值的引用 。
因此 , 沿着上述公式链条进行下去 , 如果我们希望使用一个公式从初始值173中获得3 , 复合公式为:
=INT(D2-(INT(D2/10^2)*10^2)-(INT((D2-(INT(D2/10^2)*10^2))/10^1)*10^1)/10^0)
这显然并不是我们想要的公式 , 太冗长了!如果要转换为二进制的话 , 可想而知 , 公式会怎样!
幸运的是 , 还有一种替代方法可以获取每个值 。仍以173为例 , 这次计算该值除以100、10和1中的每一个后取整得到的结果 , 然后将得到的结果除以基数10求余数:
Excel公式技巧:十进制数转换成指定进制的数

文章插图
图4
这里 , 我们可以看到“结果”列中的值并不依赖于上面的每一行 , 这次可以使用下面简单的公式得到3:
=MOD(INT($A$2/10^0),10)
沿着这个思路来构造上述方法的数组版本 。我们唯一需要确定的事情是执行计算的数组大小 , 即在指定进制下所需要的最大指数是多少?
在上面的示例中 , 显然需要的是“百” 。因此 , 对于我们的10的指数需要由三个元素组:0、1和2组成的数组 。如果考虑值10,301,444 , 那么显然需要达到10^7 , 因此我们的数组将由8个元素组成(从10^0到10^7) 。

推荐阅读