如何在不转换进制的情况下相加十六进制数?

2 投票
2 回答
11296 浏览
提问于 2025-04-17 23:25

我需要写一个函数,这个函数可以接收两个十六进制的数字,然后计算它们的和。注意,我不能把它们转换成十进制,代码需要通过循环“手动”计算。

比如说,这个函数应该这样工作:

 1
 1 f 5  (A) 
+  5 a  (B) 
------------- 
= 2 4 f 

这里有一个输入的例子: >>> add("a5", "17") 'bc'

我已经开始写代码了,但遇到瓶颈。我想把它分成三个部分:一个只加数字,另一个加数字和字母,第三个只加字母,但我不知道接下来该怎么做:

def add_hex(A,B):
lstA = [int(l) for l in str(A)]
lstB = [int(l) for l in str(B)]

if len(A)>len(B):
    A=B
    B=A
A='0'*(len(B)-len(A))+A
remainder=False
result=''
for i in range(len(B)-1)
if (A[i]>0 and A[i]<10) and (B[i]>0 and B[i]<10):
   A[i]+B[i]=result
   if A[i]+B[i]>10:
       result+='1'

任何帮助都非常感谢,我完全不知道该从哪里开始!

2 个回答

1

我觉得我们只需要记住加法的规律。就像下面这样。

"0" + "0" = "0"
"0" + "1" = "1"
"0" + "2" = "2"
       .
       .
       .
"f" + "d" = "1b"
"f" + "e" = "1c"
"f" + "f" = "1e"

我们有一个所有加法规律的字典,因为我们在学校或者其他地方学过。而且我们也学会了进位

所以我觉得这看起来像是手动加法的算法。

  1. 记住规律时要包括进位。
  2. 计算
    • 把两位数转换成一位数(a+b->c)。
    • 正确处理进位。

这是我为此写的代码。不过可能有点复杂。

import itertools

def add_hex(A,B):
    A = "0"+A
    B = "0"+B
    #Remember all pattern include carry in variable d.
    i2h = dict(zip(range(16), "0123456789abcdef"))
    a = [(i,j) for i in "0123456789abcdef" for j in "0123456789abcdef"]
    b = list(map(lambda t: int(t[0],16)+int(t[1],16), a))
    c = ["0"+i2h[i] if i<16 else "1"+i2h[i-16] for i in b]#list of digit include carry
    d = dict(zip(a,c))#d={(digit,digit):digit,,,}
    #Calculate with variable d.
    result = ""
    cur = "0"
    nex = "0"
    for i in itertools.izip_longest(A[::-1], B[::-1], fillvalue = "0"):
        cur = d[(nex, d[i][1])][1]                   #cur = carry + digit + digit
        if d[i][0]=='1' or d[(nex, d[i][1])][0]=='1':#nex = carry = carry + digit + digit
            nex = "1"
        else:
            nex = "0"
        result += cur

    return result[::-1]

#Test
A = "fedcba"
B = "012346"
print add_hex(A,B)    
print hex(int(A,16)+int(B,16))#For validation

希望这能帮到你。:)

1

你可以创建一个小功能,用来把两个单个的十六进制数字相加,并返回它们的和和一个进位(进位可以是0或1)。这个功能需要三个输入:你想要相加的两个数字和一个进位。然后,你可以从最不重要的数字开始,逐位处理这两个数字,逐个应用这个功能,同时在每一步都考虑进位。

那么我们来试试你的例子:

A 5
1 7 +

我们从最不重要的数字开始,也就是5和7,进行一次1位的加法。516 + 716 = 1210。1210小于1610,所以我们这次1位加法的结果是1210 = C16,进位是0。

接下来我们加A和1(因为我们的进位是0,所以可以直接相加)。A16 + 116 = 1110。1110也小于1610,所以这次1位加法的结果是1110 = B16,进位还是0。(如果我们有非零的进位,就在这个值上加1。)

因此,我们的最终结果是:

A 5
1 7 +
-----
B C

撰写回答