COOL!

A little side note: some parts can still be tweaked. E.g. the function 
reflect_bits(). Here are a few variations, although they don't affect the 
running time:
~~~
function reflect1(n::Uint8) # Two '&' operators and some parentheses removed
    n = n >>> 4 | n << 4
    n = (n & 0xcc) >>> 2 | (n & 0x33) << 2
    n & 0xaa >>> 1 | n & 0x55 << 1
end

r4 = uint8([0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15])
function reflect2(n::Uint8) # 4-bit lookup table (if 8-bit table is too 
large)
    r4[n>>>4+1] | r4[(n&15)+1]<<4
end

function reflect3(n::Uint8) # Building up the reverse bit-by-bit
    r = zero(Uint8)
    for i = 0:7
        r = r<<1 | (n>>>i)&1
    end
    r
end

function reflect4(n::Uint8) # Bits put together, no assignment
    n&1<<7 | (n>>>1)&1<<6 | (n>>>2)&1<<5 | (n>>>3)&1<<4 |
    (n>>>4)&1<<3 | (n>>>5)&1<<2 | (n>>>6)&1<<1 | n>>>7
end
~~~

Reply via email to