如何在Python中进行按位NOR门(编辑python数学为我工作)

时间:2013-10-05 11:53:46

标签: python bit-manipulation bitwise-operators

说我要写这个:

a=01100001 
b=01100010 
c=01100011 
d=01100100 
e=01100101 

每个字母类似于给定的数字,现在我将如何处理类似的值:

Python希望这样做:

a + b = 2200011

但我想要它做的是这个

  • 如果尝试将0和0加在一起,则显示1
  • 如果尝试将1和0加在一起显示0
  • 如果尝试将0和1加在一起显示0
  • 如果尝试将1和1加在一起,则显示0

我希望做的是a + b = 10011100

有没有办法编辑python在这种情况下计算数学的方式?

做得太远我已经给出了设置值来表示字母,但我想做的是改变python在上面的解释中给我的结果以匹配XOR门的方式

所以任何人都可以提供代码示例来给出设定值(1 + 1 = 0)(0 + 0 = 1)......例如

2 个答案:

答案 0 :(得分:8)

你说:

  

我想做的是a + b = 10011100

我的解决方案:

>>> a=0b01100001
>>> b=0b01100010

>>> bin((a | b) ^ 0b11111111)
'0b10011100'

现在,为了解释:

您要求进行NOR按位操作(http://en.wikipedia.org/wiki/NOR_gate,如果它不明显):

r = not (a or b)

此外,您可以使用De Morgan的法律,该法律相当于:

r = (not a) and (not b)

在Python中:

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

您可能也想知道^ 0b11111111是什么。好吧,not a相当于a xor 1xor在python中写成^。如果你不是100%确信,我建议你写下逻辑表。基本上,^ 0b11111111将0更改为1,将1更改为0.

bin函数给出作为参数给出的数字的二进制表示。数字开头的0b表示该数字以2为基数给出(否则为10)。

修改

最初,我首先想到的是这个问题:

bin(~(a|b))

但结果是'-0b1100100'。这是因为在Python中,数字是签名的。但是也可以通过仅保留第一个字节来获得良好的结果:

>>> bin(~(a|b) & 0xff)
'0b10011100'

编辑2:

我刚刚发现OP问了另一个问题,以便更好地理解我的答案。所以,如果你想知道为什么我使用XOR来做NOT,请在这里看一个很好的解释:https://stackoverflow.com/a/19203069/1787973

答案 1 :(得分:1)

你给了我们所有可能输入的“真值表”(感谢你)。如果两个输入都为0,则表示输出应为1,否则输出应为0.该逻辑运算的名称为NOR,即OR的否定。

请注意,您的输入是基数为10的数字,但它们似乎代表基数为2的数字或位集。所以我们应该做的第一件事就是将它们从基础10形式转换为基础2.简单(但不是过于高效)的方式是int(str(a), 2)

从那里开始,只需对数字进行NOR操作即可。从这里开始:https://wiki.python.org/moin/BitwiseOperators看起来你可以做~(x|y)(否定OR,按位)。