今日見たソースファイルに、こんな記述があった。
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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。