如何通过数学将数字转换为以16为底的数字(不使用字符串)?

问题描述 投票:-1回答:2

说我有

1009732533765201

而且我想要:

0x1009732533765201这是

1155581383011619329

您可以使用像这样的字符串在编程语言中执行此操作

int('1009732533765201',16)

但是我想要纯粹的数学方法。将1009732533765201转换为1155581383011619329的base16

[我试过:int('1009732533765201',16),但这使用了字符串,并且对于大数而言很慢,我只在寻找数学角度。

[这是一种数学方法,我知道该怎么做:0x1009732533765201 = 1155581383011619329

以下是执行此操作的python方法:int('1009732533765201',16)

但是我只能手动执行第一个数学版本。如何做到这一点,在不使用字符串的情况下将0x1009732533765201转换为将“ 0x”连接到“ 1009732533765201”并且不使用eval的方法

有没有办法采用1009732533765201,并将其转换为与0x1009732533765201相同的输出,以在不使用int('1009732533765201',16)的情况下获取其整数,我的目标是找到更快的方法

[由PARTHIAN SHOT回答,这是他所采取的方法的结果,而这正是我一直在寻找的方法,而无需int()即可做到这一点

orig = 1009732533765201 
num = orig 
result = 0 
i = 0 
while num != 0: 
     result += (num % 10) * (16 ** i) 
     num //= 10 
     i += 1 

print(orig, num, result, "%x" % (result))

1009732533765201 0 1155581383011619329 1009732533765201

python math
2个回答
0
投票

这里的想法是,我们一次从右到左查看原始十进制数字的每个数字,然后将其乘以16 ** i而不是10 ** i,然后将其添加到新数字中。

结果等同于将数字的原始十进制表示形式解释为十六进制。

#!/usr/bin/env python

orig = 34029235
num = orig
result = 0
i = 0
while num != 0:
    result += (num % 10) * (16 ** i)
    num //= 10
    i += 1

print(orig, num, result, "%x" % (result))

运行该代码可以使我们...

bash$ ./main.py 
(34029235, 0, 872583733, '34029235')
bash$

0
投票

正如我在评论中说的那样,Python开箱即用地知道如何处理基数为16的数字。只需将16的底值分配给变量即可。

这里是一个例子:

Python 3.7.4 (default, Aug 12 2019, 14:45:07) 
[GCC 9.1.1 20190605 (Red Hat 9.1.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> i=0x16
>>> i
22
>>> i=0xAA
>>> i
170
>>>

正如我所说,这适用于其他基础,例如基础2:

>>> i=0b1010
>>> i
10
>>> 

和基数8:

>>> i=0o12
>>> i
10
>>>
© www.soinside.com 2019 - 2024. All rights reserved.