it is a dummy question, but I need to understand it more deeply
Python integers use two's complement to store signed values. That means that positive numbers are stored simply as their bit sequence (so 14 is 00001110
since it's equal to 8 + 4 + 2). On the other hand, negative numbers are stored by taking their positive quantity, inverting it, and adding one. So -14 is 11110010
. We took the bitwise representation of 14 (00001110
), inverted it (11110001
), and added one (11110010
).
But there's an added wrinkle. Python integer values are bignums; they can be arbitrarily large. So our usual notion of "this number is stored in N bits" breaks down. Instead, we may end up with two numbers of differing lengths. If we end up in that situation, we may have to sign extend the shorter one. This is just a fancy way of saying "take the most significant bit and repeat it until the number is long enough for our liking".
So in the case of 14
and -14
, we have
0010
1110
We &
them together. Only the second bit (counting from the right, or least significant bit) is true in both, so we get 0010
, or 2. On the other hand, with 16
and -16
, we get
010000
110000
For -16
, we took positive sixteen (010000
), flipped all of the bits (101111
), and then added one, which got carried all the way over to the second most significant bit (110000
). When we &
these, we get 16.
010000
See also BitwiseOperators - Python Wiki