Vraag Hoe doe ik een bitwise Geen bewerking in Python?


Om het bouwen van een Xor-bewerking met meer elementaire bouwstenen (met Nand, Of en En in mijn geval) te testen, moet ik een niet-bewerking kunnen uitvoeren. De ingebouwde not lijkt dit alleen te doen met enkele bits. Als ik doe:

x = 0b1100
x = not x

Ik zou moeten krijgen 0b0011 maar in plaats daarvan krijg ik gewoon 0b0. Wat doe ik verkeerd? Of mist Python deze basisfunctionaliteit gewoon?

Ik weet dat Python een ingebouwde Xor-functie heeft maar ik gebruik Python om dingen te testen voor een HDL-project / cursus waar ik een Xor-poort moet bouwen. Ik wilde dit in Python testen, maar ik kan niet zonder een equivalent van een Niet-poort.


12
2017-07-01 01:22


oorsprong


antwoorden:


Het probleem met het gebruik ~ in Python is dat het werkt met ondertekende gehele getallen. Dit is ook de enige manier die echt logisch is, tenzij je jezelf beperkt tot een bepaald aantal stukjes. Het zullen werk goed met bitwise math, maar het kan het moeilijk maken om de tussenresultaten te interpreteren.

Voor logica met 4 bits moet u alleen aftrekken van 0b1111

0b1111 - 0b1100  # == 0b0011

Voor 8-bits logica, aftrekken van 0b11111111 enz.

De algemene vorm is

def bit_not(n, numbits=8):
    return (1 << numbits) - 1 - n

16
2017-07-01 01:37



Probeer dit, het wordt de bitsgewijze aanvulling genoemd operator:

~0b1100

3
2017-07-01 01:25



Een andere manier om dit te bereiken, is om een ​​masker als dit toe te wijzen (zouden alle 1's moeten zijn):

mask = 0b1111

Geef het vervolgens met uw nummer uit zoals dit:

number = 0b1100
mask = 0b1111
print(bin(number ^ mask))

U kunt de exor-waarheidstabel doorverwijzen om te weten waarom het werkt.


1
2018-06-04 07:29



De algemene vorm van John La Rooy kan op deze manier worden vereenvoudigd (python == 2.7 en> = 3.1):

def bit_not(n):
    return (1 << n.bit_length()) - 1 - n

0
2018-04-11 18:02