1

我试图从今天早些时候收到的答案中理解代码:

a=0b01100001
b=0b01100010

bin((a ^ 0b11111111) & (b ^ 0b11111111))

这是我的理解:

  • bin意味着结果将是二进制形式。
  • a是通过门的过程
  • 0b表示基数 2 形式

有人可以解释其余的吗?我很困惑11111111&门(混淆了为什么将两者分开)。你将如何改变它以适用于任何其他门,例如 XOR、NAND 或......?

4

3 回答 3

5
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 位被反转。

于 2013-10-05T21:45:21.680 回答
1

从原始答案开始,它解释了如何使用 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

于 2013-10-05T21:43:58.923 回答
0

^XOR 运算符。XOR 表示异或。其中一个操作数^是一序列。这实质上意味着另一个操作数(即,a或者b)中的每一位都将被翻转。一旦完成了两个单独的 XOR 操作,它们的结果就会被 OR-ed。

从位和按位运算之外看,如果您从逻辑运算领域来看,代码本质上(! A ) ^ (! B)是按照德摩根定律! (A v B)执行的操作与 NOR 操作相同。

于 2013-10-05T21:50:47.443 回答