2012/02/04

(a+(n-1)) / nということ

私はときどき手厳しいので、ご容赦いただきたい。

今日見たソースファイルに、こんな記述があった。
int getBlocks(int bytes)

{

  int ret = bytes / BLOCK_SIZE;

  if((bytes % BLOCK_SIZE) > 0) {

    ret++;

  }

  return ret;

}
なにをしているのだろう?と思ったが、これはこういうことだ。
1ブロック16byteのしくみがある。
そこにデータ長だけ与えられて、何ブロック必要になるかを求めているのだ。
この世界、int型の割り算は切り捨てになるので、最初のretは切り捨てた割り算の結果が得られる。
その後、剰余が0以上であればきっちり割り切れたわけではないので、++しているというところだ。

書くなら、こんな感じだろうか。
int getBlocks(int bytes)

{

  return (bytes + (BLOCK_SIZE - 1)) / BLOCK_SIZE;

}

たとえば、BLOCK_SIZE=16としよう。
bytesが0なら、
(0 + 15) / 16 ===> 0
だし、1~16なら
(1 + 15) / 16 ===> 1
(16+ 15) / 16 ===> 1
なのだ。
突き詰めると、
(a + (n-1)) / n
ということになる。
なると思うのだ。

最近はよく知らないが、除算命令を載せたCPUは少ないと思う。
その代わりに、割り算が発生するとコンパイラが関数に置き換えるのだ。
関数で何をするかというと、引き算だ。
筆算と同じように、上の桁から引いていけば商と余りが得られるのだ。
しかし、それは味気ない。
もうちょっとなんだかねー、というところだ。
そういう場には、ちょうどいいんじゃなかろうかね。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。