如何制作按位NOR门

时间:2013-10-05 21:21:12

标签: python

我正在尝试理解an answer I received earlier today中的代码:

a=0b01100001
b=0b01100010

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

这是我的理解:

  • bin表示结果将采用二进制形式。
  • a是进入大门的过程
  • 0b表示基础2表单

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

3 个答案:

答案 0 :(得分: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位被反转。

答案 1 :(得分:1)

从原始答案开始,解释了如何使用AND和NOT来实现NOR门:

  

您要求进行NOR按位操作:

r = not (a or b)
     

此外,您可以使用De Morgan定律,即相当于:

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翻转数字的前8位,因为有8个1。而~翻转所有位。如果您只对前8位感兴趣,那么可以添加& 0b11111111,将结果截断为8位:

>>> bin((~a & ~b) & 0b11111111)
'0b10011100'

在我看来,这比神秘的^ 0b11111111更好。

答案 2 :(得分:0)

^是XOR运算符。异或意味着异或。 ^的操作数之一是一系列的操作数。这实质上意味着另一个操作数中的每一位(即ab)将翻转。完成两个单独的XOR操作后,其结果将被删除。

在比特和按位运算之外,如果从逻辑运算领域看到它,代码本质上是(! A ) ^ (! B),根据DeMorgan的定律,! (A v B)与{{1}相同这是NOR操作。