Re: 一番右端の立っているビット位置を求める「ものすごい」コード
http://d.hatena.ne.jp/siokoshou/20090704#p1
すごいなあ。いろいろ応用が利きそう。
うろ覚えながら M 系列実装してみる。とりあえず 6bit目と 1bit目の出口をフィードバックしてみる。
def M(n, q = 6, p = 1): nm = 2**n-1 m = [0] * nm + [1] for j in xrange(nm-n): for i in xrange(nm): m[i] = m[i+1] m[nm] = m[nm - q] ^ m[nm - p] return m N=6 m = M(N) bit="".join(map(lambda x: str(x), m)) print bit print hex(int(bit, 2))
0000001111110101011001101110110100100111000101111001010001100001 0x3f566ed27179461L
なんか記憶がうっすらだけれども一応出たみたい。
弾さんところで frexp使って出してるコードがあって、なるほど〜とか思ったんだけど、よーく考えてみたら、この場合 n & -nはいらない。さらに直接ビットパターンからひっぱりだすようにしてみたけど、
int ntz_fltexp(U64 n){ union { int i; float f; } u; if ( n == 0 ) return 64; u.f = n; return (u.i >> 23) - 127; }
まあまあ、という程度にしか早くならなかった(Pentium4 2.40GHz/ Linux2.6.24-23)
ntz_frexp: 7.28352s ntz_fltexp: 4.63627s
ちょこざいな、だった。