From hexadecimal to one's complement in Python

13,210

Solution 1

Just use the XOR operator ^ against 0xFF:

>>> hex(0x9E ^ 0xFF)
'0x61'

If you need to work with values larger than a byte, you could create the mask from the int.bit_length() method on your value:

>>> value = 0x9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x61'
>>> value = 0x9E9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x6161'

Solution 2

Hah. just found out that python bin() return a string!

so we can have some fun at this!

for x in numbers: # numbers is a list of int
    b = bin(x)
    #print b # e.g. String 0b1011100101
    b = b.replace('0', 'x')
    b = b.replace('1', '0')
    b = b.replace('x', '1')
    b = b.replace('1b', '0b')
    #print b # String 0b0100011010
    print int(b, 2) # the decimal representation
Share:
13,210
Admin
Author by

Admin

Updated on June 17, 2022

Comments

  • Admin
    Admin almost 2 years

    Is there an easy way to produce a one's complement in python?

    For instance, if you take the hex value 0x9E, I need to convert it to 0x61.

    I need to swap the binary 1's for 0's and 0's for 1's. It feels like this should be simple.

  • Kos
    Kos over 11 years
    OK I'm confused, why is ~x wrong? It's supposed to be the binary negation operator after all. I can't wrap my mind over the lack of signed/unsigned distinction when binary ops are concerned
  • Martijn Pieters
    Martijn Pieters over 11 years
    @Kos: ~ literally returns -(x+1), which is great when dealing with signed values. So ~0x9E is -159, or -0x9f hex. For unsigned bitwise work, not so great..
  • Kos
    Kos over 11 years
    OK I got this, Python's "conceptually infinite string of 1's in front of negative numbers" approach has messed with my head. Analogies to C bitwise ops won't work here :(
  • Martijn Pieters
    Martijn Pieters over 11 years
    @aka.nice: Sure, that works (I used | bitwise or accidentally). You still need to create the mask though.
  • Joe
    Joe almost 4 years
    This just made it to the top five of my most-pragmatic-code list :)