为什么我使用逻辑运算符和索引没有得到预期的输出?
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
。这样,如果输入是 32
和 32
,而不是将 [False, False, False, False, False, False]
作为输出,新输入的 if
语句将添加缺失值 in.
我无法达到预期的输出。我正在尝试使用 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
。这样,如果输入是 32
和 32
,而不是将 [False, False, False, False, False, False]
作为输出,新输入的 if
语句将添加缺失值 in.