use*_*377 0 python bit-manipulation bitwise-operators
说我写这个:
a=01100001
b=01100010
c=01100011
d=01100100
e=01100101
Run Code Online (Sandbox Code Playgroud)
现在,每个字母都与给定的数字类似,我将如何处理相似的值:
Python会想要这样做:
a + b = 2200011
Run Code Online (Sandbox Code Playgroud)
但我想要它做的就是这个
我想做的是 a + b = 10011100
有没有办法在这个实例中编辑python算出数学的方式?
到目前为止,我已经给出了设置值来表示字母,但我想做的是改变python给我结果的方式来匹配上面的解释中的XOR门
所以任何人都可以给出代码的例子来给出设定值(1 + 1 = 0)(0 + 0 = 1)...例如
你说:
我想做的是a + b = 10011100
我的解决方案
>>> a=0b01100001
>>> b=0b01100010
>>> bin((a | b) ^ 0b11111111)
'0b10011100'
Run Code Online (Sandbox Code Playgroud)
现在,为了解释:
您要求进行NOR按位操作(如果不明显,请http://en.wikipedia.org/wiki/NOR_gate):
r = not (a or b)
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用De Morgan定律,它表示它相当于:
r = (not a) and (not b)
Run Code Online (Sandbox Code Playgroud)
在Python中:
>>> bin((a ^ 0b11111111) & (b ^ 0b11111111))
'0b10011100'
Run Code Online (Sandbox Code Playgroud)
你可能也想知道那是什么^ 0b11111111.好吧,not a相当于a xor 1并xor用^python 编写.如果你不是100%确信,我建议你写下逻辑表.所以基本上,^ 0b11111111将0更改为1,将1更改为0.
该bin函数给出了作为参数给出的数字的二进制表示.所述0b在号码的开头是指数在基座2(否则它是基体10)给出.
编辑:
最初,我对这个问题的第一个想法是:
bin(~(a|b))
Run Code Online (Sandbox Code Playgroud)
但结果是'-0b1100100'.这是因为在Python中,数字是签名的.但是也可以通过保留第一个字节来获得良好的结果:
>>> bin(~(a|b) & 0xff)
'0b10011100'
Run Code Online (Sandbox Code Playgroud)
编辑2:
我刚刚发现OP问了另一个问题,以便更好地理解我的答案.所以,如果你想知道为什么我使用XOR来做NOT,请在这里看到一个很好的解释:https://stackoverflow.com/a/19203069/1787973