How to do a bitwise NOR Gate in Python (editing python maths to work for me)

柔情痞子 提交于 2019-12-28 19:28:28

问题


Say I was to write this:

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

each letter resembles the given numbers now how would I deal with the resembling values:

Python would want to do this:

a + b = 2200011

but what I want it to do is this

  • if 0 and 0 are attempted to be added together show 1
  • if 1 and 0 are attempted to be added together show 0
  • if 0 and 1 are attempted to be added together show 0
  • if 1 and 1 are attempted to be added together show 0

What I wish to do is a + b = 10011100

Is there a way to edit the way python works out maths in this instance?

do far i have given set values to represent the letters but i want to do is change the way that python gives me results to match XOR gate in the explanation above

so could anyone give example of a code to give set values (1+1=0)(0+0=1) ... e.g


回答1:


You said:

What I wish to do is a + b = 10011100

My solution:

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

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

And now, for the explanation:

You are asking for a NOR bitwise operation (http://en.wikipedia.org/wiki/NOR_gate if it's not obvious):

r = not (a or b)

Also, you can use De Morgan's law, that says that it's equivalent to:

r = (not a) and (not b)

In Python:

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

You may also wonder what's that ^ 0b11111111. Well, not a is equivalent to a xor 1 and xor is written ^ in python. I'd suggest you write down the logic table if you are not 100% convinced. So basically, ^ 0b11111111 changes the 0 to 1 and the 1 to 0.

The bin function gives the binary representation of the number given as a parameter. The 0b at the beginning of a number means that the number is given in base 2 (otherwise it's base 10).

Edit:

Initially, my first thought for this problem was:

bin(~(a|b))

But the result is '-0b1100100'. This is because in Python the number are signed. But it is also possible to get the good result by only keeping the first byte:

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

Edit 2:

I've just found that OP asked another question in order to better understand my answer. So, if you wonder why I used a XOR to do the NOT, see a good explanation here: https://stackoverflow.com/a/19203069/1787973




回答2:


You gave us the "truth table" of all possible inputs (thanks for that). And you say that the output should be 1 if both inputs are 0, otherwise the output should be 0. The name of that logical operation is NOR, i.e. the negation of OR.

Note that your inputs are base 10 numbers, but they appear to represent base 2 numbers, or bitsets. So perhaps the first thing we should do is convert them from their base 10 form to base 2. A simple (but not overly efficient) way would be int(str(a), 2).

From there, it's just a matter of doing the NOR operation on the numbers. From here: https://wiki.python.org/moin/BitwiseOperators it looks like you can do ~(x|y) (negated OR, bitwise).



来源:https://stackoverflow.com/questions/19197495/how-to-do-a-bitwise-nor-gate-in-python-editing-python-maths-to-work-for-me

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!