ようこそゲストさん

したっぱプログラマーの日記(The diary of a minor programmer)

2008/05/17(土) おまいら全員32の倍数にしたやんよ!

未分類

今日はプログラミング寄り、もしくは数学寄りな話。

昨日は先週のお仕事の疲れを癒しに後輩と飲みに行った。その中で、ある数を32の倍数に丸める方法の話になった。より正確に言うと、「ある数Xがあって、X以上の32の倍数のなかで一番近い数を探す。」ってことだ。

文章より、数式の方が分かりやすいかな。早速答えを述べます。最初に出た答えは以下の式。
















X = X + (32 - X % 32);
( % は割ったものの余りという意味です。)

しかし、これだとXがちょうど32の倍数だったときにうまくいかない。ついでにもうちょっとスマートに書きたい。
酒を飲みながら飲み屋で ろくな会話もせずに後輩と2人して頭を悩ませて、出た答えが以下のもの。コンピュータで考えた場合の話だけど、これだと もうちょっとスマートだし なんとなく高速に処理してもらえそう。
















X = X + (~X + 1) & 0x001f;
( ~ はbitを反転したもの。& は論理積を表す。0x001fは16進数で、2進数で表すと0000 0000 0001 1111。)

元の数を反転させたものに1を足して0000 0000 0001 1111でマスクを掛けて、もとの数に足すというもの。これでOK。これより簡潔かつ高速な書き方は思いつかんかった。

1: よっきー 2008年05月17日(土) 午後0時00分

#define ALIGN( value, align ) \
(((value) + ((align) - 1)) & (~((align) - 1)))

// ただしalignは2の倍数

よく使わない?
ハードをよく直に叩いているから、
僕はしょっちゅう使う。

2: わけん 2008年05月18日(日) 午前9時15分

> よく使わない?
> ハードをよく直に叩いているから、
ハードを直に叩くことがほとんどないせいか、初めてみました!
他に、bit演算のテクニックあったら教えてちょ。


名前:  非公開コメント   

  • TB-URL  http://wkpn.net/blog/adiary.cgi/0865/tb/