「画像の横幅widthとbppが与えられて4バイトでalignされたpitchを求める式」

2005-04-15
に出てきた式を何とか理解したい!

pitch = (((width * bpp + 7)>>3)+3)&~3;

まず、"width * bpp"の部分。幅*1pixelあたりのbit数。
    →1ラインのbit数。

次に、"+ 7)>>3"の部分。7を足して3bit切り捨てつつ8で割る。つまり、繰り上げて8(1Byteあたりのbit数)の倍数にしつつ8で割る。
    →1ラインの最低限必要なbyte数。
最後に、"+3)&~3"の部分。3を足して2bit切り捨て。つまり、繰り上げて4の倍数にする。
    →4バイトでalignされたpitch(1ラインのbyte数)

どっちもやってることは、繰上げなのか。
これだけ理解するのに1時間近くかかっとるし。


もう一個あった。

pitch = ((width * bpp + 31)>>3)&~3;

より複雑になっとる。

1ラインのbit数に31を足す。31 = 4byte - 1だな。
う〜む。感覚的にはわかるんだが…
さっきの8で割ってから+3するかわりに先に+3*8=+24するので、+7とあわせて+31。
いまいちだな。
直接この式にたどりつく発想は……?やっぱ経験ですかね。


まてよ、こうしたらどうだろう。

pitch = (((width * bpp + 31)&~31)>>3;

個人的にはこっちのほうがわかりやすいかなあ。


参考にさせていただきました↓
id:replicorn:20050415
id:replicorn:20050416