bitwise not - not what I expected

Irmen de Jong irmen at -NOSPAM-REMOVETHIS-xs4all.nl
Sun Aug 17 17:21:11 CEST 2003


While others explained how the ~ operator works, let me suggest
another possibility: the bitwise exclusive or.

 >>> def bin(i):
...     l = ['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111',
...          '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']
...     s = ''.join(map(lambda x, l=l: l[int(x, 16)], hex(i)[2:]))
...     if s[0] == '1' and i > 0:
...         s = '0000' + s
...     return s
...
 >>> bin(18)
'00010010'
 >>> ~18
-19
 >>> bin(~18)     # tricky...
'11111111111111111111111111101101'
 >>> ~18 & 0x1f
13
 >>> bin(~18 & 0x1f)
'00001101'
 >>> 18 ^ 0x1f        # XOR!
13
 >>> bin(18 ^ 0x1f)   # XOR
'00001101'
 >>>


You still have to think about the number of bits you want to invert.
x ^ 0x1f inverts the 5 least significant bits of x.
x ^ 0xff inverts the 8 least significant bits of x, and so on.


--Irmen de Jong





More information about the Python-list mailing list