Search code examples
pythondata-conversiontilde

Why does ~True result in -2?


In Python console:

~True

Gives me:

-2

Why? Can someone explain this particular case to me in binary?


Solution

  • int(True) is 1.

    1 is:

    00000001
    

    and ~1 is:

    11111110
    

    Which is -2 in Two's complement1

    1 Flip all the bits, add 1 to the resulting number and interpret the result as a binary representation of the magnitude and add a negative sign (since the number begins with 1):

    11111110 → 00000001 → 00000010 
             ↑          ↑ 
           Flip       Add 1
    

    Which is 2, but the sign is negative since the MSB is 1.


    Worth mentioning:

    Think about bool, you'll find that it's numeric in nature - It has two values, True and False, and they are just "customized" versions of the integers 1 and 0 that only print themselves differently. They are subclasses of the integer type int.

    So they behave exactly as 1 and 0, except that bool redefines str and repr to display them differently.

    >>> type(True)
    <class 'bool'>
    >>> isinstance(True, int)
    True
    
    >>> True == 1
    True
    >>> True is 1  # they're still different objects
    False