2

假设我要写这个:

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) ... 例如

4

2 回答 2

11

你说:

我想做的是 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)

此外,您可以使用德摩根定律,它相当于:

r = (not a) and (not b)

在 Python 中:

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

您可能还想知道那是什么^ 0b11111111。嗯,相当于not a是用python写的。如果您不是 100% 相信,我建议您写下逻辑表。所以基本上,将 0 更改为 1,将 1 更改为 0。a xor 1xor^^ 0b11111111

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

编辑:

最初,我对这个问题的第一个想法是:

bin(~(a|b))

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

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

编辑2:

我刚刚发现 OP 提出了另一个问题,以便更好地理解我的答案。因此,如果您想知道为什么我使用 XOR 来执行 NOT,请在此处查看一个很好的解释:https ://stackoverflow.com/a/19203069/1787973

于 2013-10-05T12:28:52.973 回答
1

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

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

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

于 2013-10-05T12:09:30.980 回答