▼ 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。これより簡潔かつ高速な書き方は思いつかんかった。
- TB-URL http://wkpn.net/blog/adiary.cgi/0865/tb/
1: よっきー 2008年05月17日(土) 午後0時00分
#define ALIGN( value, align ) \
(((value) + ((align) - 1)) & (~((align) - 1)))
// ただしalignは2の倍数
よく使わない?
ハードをよく直に叩いているから、
僕はしょっちゅう使う。
2: わけん 2008年05月18日(日) 午前9時15分
> よく使わない?
> ハードをよく直に叩いているから、
ハードを直に叩くことがほとんどないせいか、初めてみました!
他に、bit演算のテクニックあったら教えてちょ。