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
If you wanted to know why ~1 is -2, it's because you are inverting all bits in a signed integer; 00000001 becomes 1111110 which in a signed integer is a negative number, see Two's complement:
What is
int(True)
? It is1
.1
is:and
~1
is:Which is
-2
in Two's complement11 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):
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
andFalse
, and they are just "customized" versions of the integers 1 and 0 that only print themselves differently. They are subclasses of the integer typeint
.So they behave exactly as 1 and 0, except that
bool
redefinesstr
andrepr
to display them differently.The Python
bool
type is a subclass ofint
(for historical reasons; booleans were only added in Python 2.3).Since
int(True)
is1
,~True
is~1
is-2
.See PEP 285 for why
bool
is a subclass ofint
.If you wanted the boolean inverse, use
not
:If you wanted to know why
~1
is-2
, it's because you are inverting all bits in a signed integer;00000001
becomes1111110
which in a signed integer is a negative number, see Two's complement:where the initial
1
bit means the value is negative, and the rest of the bits encode the inverse of the positive number minus one.~True == -2
is not surprising ifTrue
means1
and~
means bitwise inversion......provided that
True
can be treated as an integer andEdits: