我试图将十进制数转换为任意基数并返回十进制数。我在another question找到了以下代码:
def int2base(x,b,alphabet='0123456789abcdefghijklmnopqrstuvwxyz'):
'convert an integer to its string representation in a given base'
if b<2 or b>len(alphabet):
if b==64: # assume base64 rather than raise error
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
else:
raise AssertionError("int2base base out of range")
if isinstance(x,complex): # return a tuple
return ( int2base(x.real,b,alphabet) , int2base(x.imag,b,alphabet) )
if x<=0:
if x==0:
return alphabet[0]
else:
return '-' + int2base(-x,b,alphabet)
# else x is non-negative real
rets=''
while x>0:
x,idx = divmod(x,b)
rets = alphabet[idx] + rets
return rets
当我将小数转换为十六进制时:
in_base16 = int2base(number, 16)
它有效,但当我尝试将该结果转换回十进制(基数为10)时:
back_to_10 = int2base(in_base16, 10)
...它给了我错误:
if x<=0:
TypeError: '<=' not supported between instances of 'str' and 'int'
由于某种原因,它无法将字符串转换回数字。我不明白为什么。我如何将一个任意数的基数转换回十进制数?
答案 0 :(得分:1)
您的基本问题是签名:您的函数仅作为整数在x
上起作用。相反,您需要第二个对字符串起作用的函数,或者需要在此例程顶部进行类型检查以检测输入类型。
基本问题是你假设你可以通过简单的参考获得基数(基数)内的数字值;这适用于整数,但不适用于字符串。 “9”不会产生9
的数值; “B”不会给你11。
相反,您需要将字符提供给index
函数并获取返回值:
digit_value = alphabet.index(char)
将为您提供字符中字符的位置,这是您计算所需的数字值。
你能从那里拿走吗?
答案 1 :(得分:1)
您的int2base
函数只接受一个整数作为输入,因此您需要将字符串转换为整数。因此,您只需使用内置函数int(string, base)
即可:
in_base16 = int2base(number, 16)
back_to_10 = int2base(int(in_base16, 16), 10)
哪种方法正常。
答案 2 :(得分:1)
如果base-n最多为36,则可以使用built-in int(str,base)
。
>>> int('AA', 32)
330
答案 3 :(得分:1)
您将需要一个函数将int转换为基数(返回代表该基数的字符串-此处直到基数36):
digits = '0123456789abcdefghijklmnopqrstuvwxyz'
def int2base(n, b=2, digits=digits):
"convert integer n to base b"
if n < 0:
raise ValueError("no negative numbers")
if n < b:
return digits[n]
res = []
q = n
while q:
q, r = divmod(q, b)
res.append(digits[r])
return ''.join(reversed(res))
和另一个将基数转换回int的函数:
def base2int(s, base=2, digits=digits):
"convert string s representing a number in base to int (base 10)"
if not (2 <= base <= len(digits)):
raise ValueError("base must be >= 2 and <= %d" % len(digits))
res = 0
for i, v in enumerate(reversed(s)):
digit = digits.index(v)
res += digit * (base ** i)
return res