我试图从今天早些时候收到的答案中理解代码:
a=0b01100001
b=0b01100010
bin((a ^ 0b11111111) & (b ^ 0b11111111))
这是我的理解:
bin
意味着结果将是二进制形式。a
是通过门的过程0b
表示基数 2 形式
有人可以解释其余的吗?我很困惑11111111
。&
是与门(混淆了为什么将两者分开)。你将如何改变它以适用于任何其他门,例如 XOR、NAND 或......?
我试图从今天早些时候收到的答案中理解代码:
a=0b01100001
b=0b01100010
bin((a ^ 0b11111111) & (b ^ 0b11111111))
这是我的理解:
bin
意味着结果将是二进制形式。a
是通过门的过程0b
表示基数 2 形式有人可以解释其余的吗?我很困惑11111111
。&
是与门(混淆了为什么将两者分开)。你将如何改变它以适用于任何其他门,例如 XOR、NAND 或......?
a ^ 0b11111111 #exclusive or's each bit in a with 1, inverting each bit
>>> a=0b01100001
>>> bin(a ^ 0b11111111)
'0b10011110'
>>> bin((a ^ 0b11111111) & (b ^ 0b11111111))
'0b10011100'
这与使用 ~ 运算符不同,因为 ~ 返回一个否定的二进制结果。
>>> bin(~a & ~b)
'-0b1100100
原因是 ~ 运算符反转用于表示数字的所有位,包括通常不显示的前导 0,从而导致 2 的补码负结果。通过使用 ^ 和 8 位二进制掩码,只有前 8 位被反转。
从原始答案开始,它解释了如何使用 AND 和 NOT 实现 NOR 门:
您要求进行 NOR 位运算:
r = not (a or b)
此外,您可以使用德摩根定律,它相当于:
r = (not a) and (not b)
海报然后将该伪代码翻译成您发布的 Python。出于某种原因,他过去常常^ 0b11111111
做一个二进制 NOT,而不是简单~
的 ,这是我会选择的。如果我们切换(a ^ 0b11111111)
到更简单的,~
那么我们得到:
bin(~a & ~b)
该表达式就是您在 Python 中编写“(非 a)和(非 b)”的方式。~
表示 NOT 和&
表示 AND。
二进制 NOT 翻转数字中的所有位。0 变为 1,1 变为 0。直接的方法是使用~
. 翻转数字中所有位的间接方法是将其与所有 1 位进行异或。这具有相同的效果,只是写的时间更长。
或者实际上,更准确地说,它具有几乎相同的效果。^ 0b11111111
翻转数字的前八位,因为有八个 1。而~
翻转所有位。如果您只对前 8 位感兴趣,则可以添加& 0b11111111
,这会将结果截断为 8 位:
>>> bin((~a & ~b) & 0b11111111)
'0b10011100'
在我看来,这比神秘好^ 0b11111111
。
是^
XOR 运算符。XOR 表示异或。其中一个操作数^
是一序列。这实质上意味着另一个操作数(即,a
或者b
)中的每一位都将被翻转。一旦完成了两个单独的 XOR 操作,它们的结果就会被 OR-ed。
从位和按位运算之外看,如果您从逻辑运算领域来看,代码本质上(! A ) ^ (! B)
是按照德摩根定律! (A v B)
执行的操作与 NOR 操作相同。