二进制减法 - Python

7

我想制作一个二进制计算器,但是在减法部分遇到了问题。这是我的代码(我尝试了适应我在这个网站上找到的求和的代码)。

    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]

这个程序可以成功地进行某些二进制减法,但使用其他的却失败了。 有人能帮我解决问题吗?非常感谢。

9
删除您现有的所有代码,并编写 def SubtractionBinary(s1, s2): return bin(int(s1, 2) - int(s2, 2))[2:]。该函数用于二进制数的减法运算,将两个二进制字符串作为参数传入,返回它们的差的二进制表示形式。 - kindall
请描述您的方法的想法。它是否有意义? - BurningKarl
@user3856011 - @kindall 指出您可以使用 int(s, 2) 将二进制字符串 s 转换为 Python 整数,使用内置减法,然后在结果上调用 bin() 将其转换回二进制字符串。 - augurar
你的代码是基于这个答案实现二进制求和的,对吗? - augurar
@augurar:你误解了我的问题。我想让user2328079重新考虑他的方法,因为我不理解它。 - BurningKarl
2个回答

5

简短回答: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:
        ...

这样你就可以为每种可能性单独设置一个块,这样就不会像你第一次尝试时忽略了某些情况。

1
我希望下面的回答能够帮到您。
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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接