如何将整数转换为任意进制的字符串?

331 投票
36 回答
401901 浏览
提问于 2025-04-15 19:18

Python可以很简单地通过给定的进制把字符串转换成整数,方法是使用

int(str, base). 

我想做的是反向操作:从一个整数创建字符串,也就是说,我想要一个函数 int2base(num, base),它能做到:

int(int2base(x, b), b) == x

函数的名字和参数顺序并不重要。

对于任何一个数字 xb(也就是 int() 可以接受的进制)。

这个函数其实很简单,写起来比我在这里描述它要容易多了。不过,我觉得我可能漏掉了什么。

我知道有 binocthex 这些函数,但我不能用它们,原因有几个:

  • 这些函数在旧版本的Python中不可用,而我需要兼容(2.2)

  • 我想要一个通用的解决方案,可以对不同的进制使用相同的调用方式

  • 我想支持除了2、8、16以外的其他进制

相关链接

36 个回答

124

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如,有人可能会在代码中遇到错误,或者想知道如何更好地实现某个功能。这时候,StackOverflow这个网站就很有用。它是一个程序员交流的平台,大家可以在这里提问、回答问题,分享经验。

在这个网站上,你可以看到很多人提出的问题和他们的解决方案。每个问题下面通常会有很多人给出的不同答案,有的可能很简单,有的则比较复杂。通过这些讨论,初学者可以学到很多实用的知识和技巧。

总之,StackOverflow是一个很好的资源,特别是对于刚开始学习编程的人来说,可以帮助你更快地解决问题,提升自己的技能。

"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
233

让人惊讶的是,大家给出的解决方案都是把数字转换成小的进制(比英语字母表的长度还小)。没有人尝试提供一个可以把数字转换成任意进制的方法,从2到无穷大都可以。

所以这里有一个超级简单的解决方案:

def numberToBase(n, b):
    if n == 0:
        return [0]
    digits = []
    while n:
        digits.append(int(n % b))
        n //= b
    return digits[::-1]

如果你需要把一个超级大的数字转换成进制 577

numberToBase(67854 ** 15 - 102, 577),就能给你一个正确的结果:

[4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455]

你可以把这个结果再转换成你想要的任何进制。

  1. 有时候你会发现,内置的库函数并不能满足你的需求,所以你需要自己写一个。如果你不同意,请分享你自己的解决方案,展示一个可以把十进制数字转换成577进制的内置函数。
  2. 这主要是因为对某个进制下的数字含义缺乏理解。
  3. 我鼓励你思考一下,为什么你用的方法只适用于 n <= 36。一旦你想明白了,就会明白我这个函数为什么返回一个列表,以及它的函数签名是这样的原因。
127

如果你需要让你的代码能在很老的Python版本上运行,你可以选择使用gmpy这个库。这个库里有一个快速的、通用的整数转字符串的功能,而且可以在那些老版本上使用。不过,你可能需要尝试一些旧版本的gmpy,因为最近的版本没有在那些古老的Python和GMP版本上测试过,只是在比较新的版本上测试过。

另外,如果你不太在乎速度,而更看重方便的话,可以直接用Python代码来实现。例如,在Python 2中,最简单的写法是:

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[int(x % base)])
        x = int(x / base)

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)

而在Python 3中,使用int(x / base)会得到错误的结果,所以需要改成x // base

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[x % base])
        x = x // base

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)

撰写回答