【问题标题】:Expressing and operating in higher bases在更高的基础上表达和操作
【发布时间】:2020-12-10 02:46:21
【问题描述】:

我正在为一位正在寻找基思数字 (wolfram) 的朋友开展一个项目,他要求我查看不同基数的数字。我的问题是,我不知道如何将数字转换为更高的基数,因为没有足够的唯一字符。我只能用字母去base 36,用大写字母去base 62。

有谁知道我如何以更高的基数表示数字?

【问题讨论】:

  • 作为整数列表?
  • 查看Base 62 conversion 接受的答案——可以很容易地扩展到其他基础。

标签: python base


【解决方案1】:

“表达更高的数字”是指显示它们的数字,还是实际计算它们?

如果您只想显示他们的数字,您始终可以使用列表来完成,其中每个数字都是该列表的一个元素。

例如,如果您想以 76 为基数显示数字 10,000,您可以这样表达/表示:

 [1, 55, 44]  # the number ten-thousand in base seventy-six

所以:1 x 76^2 + 55 x 76^1 + 44 x 76^0 = 10,000

但是如果你需要计算呢?那是一个不同的问题。这是一种方法:

def get_digits(n, base=10):
    """Extracts the digits of n with base into an array.
       Only works on positive numbers."""
    if n == 0:
        return [0]
    digits = []
    while n > 0:
        n, r = divmod(n, base)
        digits[:0] = [r]
    return digits

你可以这样称呼它:

get_digits(10_000, 76)  # returns [1, 55, 44]

【讨论】:

  • 我的程序的工作方式是添加数字,例如 2b_16,所以 2_16+b_16 = d_16。我认为这可以用于获取数字,但是对于添加它们,我认为我需要计算实际数字。
  • @AdamZaidi,在这种情况下,只需将 2_16 和 d_16 转换为普通的旧 Python ints,然后将它们相加,然后使用上述 get_digits() 函数转换结果。 Python ints 看起来像是以 10 为基数,但实际上并不是……它们默认以 10 为基数打印出来。
【解决方案2】:

请注意,数字显然是数字,因此内部表示不是 0-9 的字符串。听起来您只是希望能够显示数字的数字。我所知道的最简单的算法如下所示:

def digits(number: int, base: int):
    assert base > 0
    if number == 0:
        return [0]
    assert number >= 0
    ret = []
    to_process = number
    while to_process > 0:
        to_process, remainder = divmod(to_process, base)
        ret.append(remainder)
    # Convert to big-endian for familiarity
    return tuple(reversed(ret))

我们可以确认它是这样工作的:

>>> digits(10**10, 16)
(2, 5, 4, 0, 11, 14, 4, 0, 0)
>>> hex(10**10)
'0x2540be400'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多