以最佳方式将十进制转换为二进制

converting a decimal into binary in the most optimal way possible

本文关键字:转换 二进制 十进制 最佳 方式      更新时间:2023-10-16

将十进制数转换为二进制形式(即具有最佳时间复杂度(的最佳方法是什么?

通常,要将十进制数转换为二进制,我们会继续将数字除以 2 并存储其余数。但是,如果十进制形式的数字非常大,这将花费很长时间。在这种情况下,时间复杂度将是O(log n(。

所以我想知道除了这个之外,是否有其他方法可以更好地完成我的工作?

问题本质上是使用二进制整数算术计算多项式,因此结果是二进制的。假设

p(x) = a₀xⁿ + a₁xⁿ⁻¹ + ⋯ + aₙ₋₁x + aₙ

现在,如果a₀,a₁,a₂,⋯,aₙ是数字的十进制数字(每个数字都隐式表示为0到9范围内的二进制数(,并且我们在x=10时计算p(隐式二进制(,那么结果就是十进制数字序列表示的二进制数。

给定系数作为输入的情况下,在单个点上评估多项式的最佳方法是霍纳规则。这相当于以一种易于评估的方式重写 p(x(,如下所示。

p(x) = ((⋯((a₀x + a₁)x + a₂)x + ⋯ )x + aₙ₋₁)x + aₙ

这给出了以下算法。此处的数组 a[] 包含十进制数的数字,从左到右,每个数字表示为 0 到 9 范围内的小整数。从 0 开始索引的数组的伪代码:

    toNumber(a[])
        const x = 10
        total = a[0]
        for i = 1 to a.length - 1 do
            total *= x    //multiply the total by x=10
            total += a[i]  //add on the next digit
        return total

在数字以二进制表示的计算机上运行此代码会给出二进制结果。因为这就是我们在这个星球上所拥有的,这给了你想要的。

如果要获取实际位,现在可以使用高效的二进制操作从已构造的二进制数中获取它们,例如掩码和移位。

其复杂性在位数上是线性的,因为对机器整数的算术运算是恒定时间,并且它每个数字执行两个运算(除了第一个(。这是少量的工作,所以这是非常快的。

如果你需要非常大的数字,大于64位,只需使用某种大整数。如果实施得当,这将降低算术成本。

若要避免在大整数

实现需要时尽可能多地使用大整数算术,请将数字数组分解为 19 位的切片,最左侧的切片可能更少。 19 是可以转换为(无符号(64 位整数的最大位数。

将上述每个块转换为二进制,而不使用大整数,并按从左到右的顺序创建这些 64 位值的新数组。这些现在是要在 x=10¹⁹ 处评估的多项式的系数。与上述相同的算法只能用于大整数算术运算,10 替换为 10¹⁹,应在使用前用大整数算术进行评估。