我正在尝试理解an answer I received earlier today中的代码:
a=0b01100001
b=0b01100010
bin((a ^ 0b11111111) & (b ^ 0b11111111))
这是我的理解:
bin
表示结果将采用二进制形式。a
是进入大门的过程0b
表示基础2表单有人可以解释其余的吗?我对11111111
感到困惑。 &
是和门(混淆了为什么将两者分开)。你会如何改变它以适用于任何其他门,例如XOR,NAND或......?
答案 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运算符。异或意味着异或。 ^
的操作数之一是一系列的操作数。这实质上意味着另一个操作数中的每一位(即a
或b
)将翻转。完成两个单独的XOR操作后,其结果将被删除。
在比特和按位运算之外,如果从逻辑运算领域看到它,代码本质上是(! A ) ^ (! B)
,根据DeMorgan的定律,! (A v B)
与{{1}相同这是NOR操作。