【问题标题】:Binary Subtraction - Python二进制减法 - Python
【发布时间】:2020-09-25 10:32:55
【问题描述】:

我想做一个二进制计算器,但减法部分有问题。这是我的代码(我已尝试将其中的代码修改为我在此网站上找到的总和)。

    maxlen = max(len(s1), len(s2))

    s1 = s1.zfill(maxlen)
    s2 = s2.zfill(maxlen)

    result  = ''
    carry   = 0

    i = maxlen - 1
    while(i >= 0):
        s = int(s1[i]) - int(s2[i])
        if s <= 0:
            if carry == 0 and s != 0:
                carry = 1
                result = result + "1"
            else:
                result = result + "0"
        else:
            if carry == 1:
                result = result + "0"
                carry = 0   
            else:
                result = result + "1" 
        i = i - 1


    if carry>0:
        result = result + "1"

    return result[::-1]

该程序适用于某些二进制减法,但适用于其他二进制减法。 有人可以帮助我,因为我找不到错误吗?非常感谢。

【问题讨论】:

  • 删除所有现有代码并写def SubtractionBinary(s1, s2): return bin(int(s1, 2) - int(s2, 2))[2:]
  • 请描述您的方法的想法。有意义吗?
  • @user3856011 - @kindall 指出您可以使用int(s, 2) 将二进制字符串s 转换为Python 整数,使用内置减法,然后在结果上调用bin()转换回二进制字符串。
  • 你的代码是基于this answer的二进制求和,对吧?
  • @augurar:你误解了我的问题。我希望 user2328079 重新考虑他的方法,因为我不明白。

标签: python binary


【解决方案1】:

简答:您的代码在s1[i] == s2[i]carry == 1 的情况下是错误的。

更长的答案:您应该重组您的代码,为s==-1s==0s==1 提供三个独立的案例,然后在每个案例中根据carry 的值进行分支:

if s == -1:  # 0-1
    if carry == 0:
        ...
    else:
        ...
elif s == 0:  # 1-1 or 0-0
    if carry == 0:
        ...
    else:
        ...
else:  # 1-0
    if carry == 0:
         ...
    else:
        ...

这样您就可以为每种可能性设置一个单独的块,因此不会像您第一次尝试那样忽略一个案例。

【讨论】:

    【解决方案2】:

    希望下面的回答对你有帮助。

    def binarySubstration(str1,str2):
    if len(str1) == 0:
        return
    if len(str2) == 0:
        return 
    
    str1,str2 = normaliseString(str1,str2)
    startIdx = 0
    endIdx = len(str1) - 1
    carry = [0] * len(str1)
    result = ''
    
    
    while endIdx >= startIdx:
        x = int(str1[endIdx])
        y = int(str2[endIdx])
        sub = (carry[endIdx] + x) - y
    
        if sub == -1:
            result += '1'
            carry[endIdx-1] = -1
    
        elif sub == 1:
            result += '1'
        elif sub == 0:
            result += '0'
        else:
            raise Exception('Error')
    
        endIdx -= 1
       
    return result[::-1]
    

    规范化字符串

    def normaliseString(str1,str2):
        diff = abs((len(str1) - len(str2)))
        if diff != 0:
            if len(str1) < len(str2):
                str1 = ('0' * diff) + str1
                
            else:
                str2 = ('0' * diff) + str2
               
        return [str1,str2]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多