我试图从今天早些时候收到的答案中理解代码:
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 操作相同。