在十六进制基数中添加数字而不转换基数?

时间:2014-03-22 14:11:01

标签: python hex

我需要编写一个函数,它以十六进制为基数得到两个数字,并计算它们的总和,我不允许将它们转换为十进制数,代码应该计算它&#34 ;人工"使用循环。 例如,它应该如何工作:

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

这是一个输入示例: >>> add("a5", "17") ' BC'

我开始构建我的代码,但是我被卡住了,我想我会分成三个ifs,一个只能总结数字,其他数字和字母总和,第三个是字母总和,但我不知道#39;知道如何从这里继续:

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 个答案:

答案 0 :(得分:1)

你可以有一个子函数,它增加两个单位十六进制数,并返回它们的一位数和和一个进位(0或1)。此功能将采用三个输入:您要添加的两个数字和一个进位。然后,您可以循环浏览要从最不重要到最重要的两个数字的数字,并在考虑每个阶段的进位时对每对数字应用此函数。

让我们试试你的例子:

A 5
1 7 +

我们从最低有效数字5和7开始,并执行1位数的加法。 5 16 +7 16 = 12 10 。 12 10 小于16 10 ,因此我们的1位数加法的输出为12 10 = C 16 携带0。

现在我们添加A和1(我们的进位为0,所以我们可以正常添加它们)。 16 + 1 16 = 11 10 。 11 10 小于16 10 ,因此我们的1位数加法的输出为11 10 = B 16 进位为0.(如果我们有一个非零进位,我们只需将1加到此值。)

因此,我们的总体结果是:

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

答案 1 :(得分:0)

我想我们只记得添加的模式。喜欢以下。

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

我们有dictionary of all of the pattern因为我们在学校或某个地方学过它。我们还学会了carry

所以我认为这看起来像手动添加算法。

  1. 记住模式包括carry。
  2. 计算
    • 将两位数字翻译成一位数字(a + b-> c)。
    • 正确对待。
  3. 这是我的代码。但这可能有点棘手。

    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
    

    我希望它有所帮助。 :)