"Dirk Wangsadirdja" <d...@pensiun.com> wrote

I tested it and it works. But I dont understand why it works. Can someone please explain it further? Thanks.

~n means the bitwise complement (or inverse) of n.

This simply means reversing every bit of n so that 1-> 0 and 0->1

This trick relies on the fact that negative numbers are stored on computers using a thing called twos-complement (or ones-complement sometimes) . This ensures tjhe leftmost bit is always 1 which the PC uses to indicate a negative number. Thus to represent -1 we take the bitwise inverse of 1 and add 1

1 = 0001 ->  1110 + 1 -> 1111

To get back we subtract 1 and then take the bitwise complement

1111-1 -> 1110 -> 0001

But with this trick we omit the initial add by 1 stage so
range(n) yields 0...n

But the inverse of 0000 is 1111 which is interpreted as -1 by Python
as above, so 0 maps to -1  in decimal!

and thus 1 (0001) becomes 1110 to which python does: 1110 subtracting 1 becomes 1101, and inverting gives 0010 = -2!

and so on.

So using ~ maps 0,1,2... to -1,-2,-3...

Very, very sneaky and the first time I've sen it done!
(because its so opaque I wouldn't actually recommend it, most programmers would struggle to figure out what was going on and probably think ~ was a typo for - I suspect)

See wikipedia for more on twos-complement, and the related trick ,
which is also used sometimes, of ones-complement.

--
Alan Gauld
Author of the Learn to Program web site
http://www.alan-g.me.uk/


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to