【问题标题】:Why am I not getting an expected output using logical operators and indexing?为什么使用逻辑运算符和索引没有得到预期的输出?
【发布时间】:2017-03-24 14:40:29
【问题描述】:

我无法达到预期的输出。我正在尝试使用 AND、XOR 和 OR 等逻辑运算符创建一个字节加法器。我已经从代码中提取了重现问题所需的最少代码,因此假设 finalfirstvalue = "1010"finalsecondvalue = "0101"

secondvalueindex = (len(finalsecondvalue) - 1)
carry, finalans = False, []
for i in range(-1, -len(finalfirstvalue) - 1, -1):
    andone = (bool(finalfirstvalue[i])) & (bool(finalsecondvalue[secondvalueindex]))
    xorone = (bool(finalfirstvalue[i])) ^ (bool(finalsecondvalue[secondvalueindex]))
    andtwo = (bool(carry)) & (bool(xorone))
    xortwo = (bool(carry)) ^ (bool(xorone))
    orone = (bool(andone)) | (bool(andtwo))
    carry = (bool(orone))
    finalans.append(xortwo)
    secondvalueindex -= 1

answer = ''.join(str(e) for e in finalans)
print (answer)

实际输出:FalseTrueTrueTrue 预期输出:TrueTrueTrueTrue

然后代码会变回零和一。

因为它缺少一个布尔值,我觉得问题出在我的索引上。虽然我已经玩过它并且没有任何运气。

我需要对开头提到的两个变量进行这些操作,但是对于最右边的元素,然后向左移动一个以进行下一个循环,依此类推。

【问题讨论】:

    标签: python-3.x binary byte add


    【解决方案1】:

    第一个错误是您将二进制数表示为字符串值。

    finalfirstvalue = "1010" finalsecondvalue = "0101"

    secondvalueindex = (len(finalsecondvalue) - 1)==3

    所以在第二个 for 循环中你会得到结果

    (finalsecondvalue[secondvalueindex])=='0'

    如果你签入你的空闲

    >>> bool('0')
    True
    >>> 
    

    因为'0' 不是实际的 0,它是一个非空字符串,所以它返回 True。

    您需要将结果转换为int,然后再使用bool 进行检查

    这样

    (bool(int(finalsecondvalue[secondvalueindex])))

    EDIT 2添加可变长度

    使用bin()函数验证的全加器

    a="011101"
    b="011110"
    if a>b:
        b=b.zfill(len(a))
    if a<b:
        a=a.zfill(len(b))
    finalfirstvalue = a
    finalsecondvalue = b
    carry, finalans = 0, []
    secondvalueindex = (len(finalsecondvalue))
    
    for i in reversed(range(0, len(finalfirstvalue))):
        xorone = (bool(int(finalfirstvalue[i]))) ^ (bool(int(finalsecondvalue[i])))
        andone = (bool(int(finalfirstvalue[i]))) & (bool(int(finalsecondvalue[i])))
        xortwo = (carry) ^ (xorone)
        andtwo = (carry) & (xorone)
    
        orone = (andone) | (andtwo)
        carry = (orone)
        finalans.append(xortwo)
    
    
    finalans.reverse()
    answer=(''.join(str(e) for e in finalans))
    print(str(carry)+answer)
    print(bin(int(a,2) + int(b,2)))    #verification
    

    【讨论】:

    • 谢谢你。然而,它似乎只解决了部分问题。我认为我选择的逻辑运算符可能有问题。我可以提供以获得预期输出的输入似乎是非常随机的。经过进一步调查,在某些情况下更改为int 会不会导致问题?如果二进制值以零开头,则第一个零将被丢弃 - 这可以解释为什么某些结果看起来非常随机。
    • @AugustWilliams 是的,我正在努力,我会更新。
    • 非常感谢您的帮助。我也在努力修复。
    • @AugustWilliams 希望它现在可以工作,检查更新的答案。
    • 您也需要在LSB打印进位,如果它解决了您的问题,那么您可以接受它。
    【解决方案2】:

    所以我发现问题与carry 有关。我将代码更改为如下所示。在下面这段代码之前,是将二进制值转换为布尔值的代码。例如,全 1 将等于 True,全 0 将等于 False

    carry, finalans = False, []
    indexvalue = (len(finalfirstvalue)-1)
    while indexvalue >= 0:
        andone = (firstvaluelist[indexvalue]) & (secondvaluelist[indexvalue])
        xorone = (firstvaluelist[indexvalue]) ^ (secondvaluelist[indexvalue])
        andtwo = (carry) & (xorone)
        xortwo = (carry) ^ (xorone)
        orone = (andone) | (andtwo)
        carry = (orone)
        if (carry == True) & (indexvalue == 0):
            finalans.append(xortwo)
            finalans.append(True)
        else:
            finalans.append(xortwo)
        indexvalue -= 1
    
    for n, i in enumerate(finalans):
        if i == False:
            finalans[n] = "0"
        if i == True:
            finalans[n] = "1"
    
    finalans.reverse()
    answer = ''.join(str(e) for e in finalans)
    print (answer)
    

    因此,如果缺少单个值,它仍然存储在最终循环中的carry 中,但没有机会附加到最终结果中。为了解决这个问题,我添加了一个if 语句来检查carry 是否包含任何内容(True)以及循环是否在最后一个循环中,方法是检查indexvalue 是否位于0。这样,如果输入是3232,而不是得到[False, False, False, False, False, False]作为输出,新输入的if语句会将缺失值添加进去。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2015-07-03
      相关资源
      最近更新 更多