Python: Bitwise NOT and List
I realized that instead of using negative numbers to access elements of a list from the end, we can just use bitwise NOT. That looks more symmetrical (and hence beautiful).
For a list x:
First element is x[0]
Last element is x[~0] (instead of x[-1])
You can use x[~0], x[~1], x[~2]... (coz ~0==-1, ~1==-2 etc)
Did you guys know this already or is this my fresh insight? If it is the latter, YAY! :-)
23 comments
[ 5.3 ms ] story [ 66.0 ms ] threadGood little hack though, if it works for you go nuts! (but document it somewhere and be consistent)
x ^ y bitwise exclusive or of x and y
x & y bitwise and of x and y
x << n x shifted left by n bits
x >> n x shifted right by n bits
~x the bits of x inverted
Just saying.
x[::~0][~-1]
trick to get the last item. Thought that's what everyone uses.
I'll see if I can get my crew to try it out.
NB: python bitwise operations are not super fast like in C. They don't get optimized down to single CPU instructions but instead are looked up like regular type methods (e.g. __str__ and __add__). An "ob[~0]" won't kill you even in a loop but don't bother translating simple math into bit-twiddling because it won't help (and might hurt if it inflates the number of operations).
-1 == (1).__neg__()
---
Summary:
Flipping bits is tiny bit faster actually.To make negnums function produce the same result as flipbits, we need to change b=-i to b=-i-1 and this is even slower. Poke holes in my experiment please.
Look at this code I wrote for Project Euler. it checks if a sequence is "palindromic". A "palindromic" sequence reads the same both from left and from right. So the simple idea is to check from the left of the sequence to the middle, and compare each element during the process with ones read from the right. Note here I use Python 2.5 integer division (//) to ensure the index is integer.
Using official Python index syntax, I have to write "s[i] == s[-i-1]" to compare elements on symmetric positions in the sequence.
However, using the "bitwise or" trick proposed above, I just write "s[i] == [s~i]", really neat!Thanks, it means a lot...