为什么我使用逻辑运算符和索引没有得到预期的输出?

Why am I not getting an expected output using logical operators and indexing?

我无法达到预期的输出。我正在尝试使用 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

代码随后将变回零和一。

因为它缺少一个布尔值,我觉得问题出在我的索引上。虽然我玩过一点但运气不好。

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

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

finalfirstvalue = "1010" finalsecondvalue = "0101"

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

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

(finalsecondvalue[secondvalueindex]) == '0'

如果您签到您的空闲状态

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

因为 '0' 不是实际的 0 它是一个非空字符串所以它 return 正确。

您需要先将结果转换为 int,然后再用 bool

检查它们

像这样

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

编辑 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

所以我发现问题与 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 语句将添加缺失值 in.