タイトル

事例

課題

ソースコードを読むだけでは意味がわからないTYPEALIGN()という処理があった。 内容は以下のような短いものだった。

#define TYPEALIGN(ALIGNVAL,LEN) \
(((long) (LEN) + ((ALIGNVAL) - 1)) & ~((long) ((ALIGNVAL) - 1)))

処理内容をコードからそのまま表現すると、

「LEN+ALIGNVAL-1の値と、ALIGNVAL-1の値の補数の間で、ビットごとのAND演算を行い、その結果を返す。」

となる。 しかし、これでは意味がわからず、上位の処理の概要も書けない。

解決方法

下記例のように、動作事例をいくつか書いて、動作を考えてみることにした。 すると、LEN以上のALIGNVALの倍数のうち最小の値が得られることに気が付いた。 そこで、概要の欄に、

「LEN以上であるALIGNVALの倍数のうち、最小値を返す。」

と追記した。 そして、備考の欄に下記事例を貼り付けて、解読の根拠とした。

例1:ALIGNVALが4で、LENが9の場合、

前半の式と、後半の式の補数を、AND演算すると、

12  : 00001100
~3  : 11111100
AND : 00001100 = 12

例2:ALIGNVALが4で、LENが7の場合、

前半の式と、後半の式の補数を、AND演算すると、

10  : 00001010
~3  : 11111100
AND : 00001000 = 8

例3:ALIGNVALが4で、LENが5の場合、

前半の式と、後半の式の補数を、AND演算すると、

 8  : 00001000
~3  : 11111100
AND : 00001000 = 8

例4:ALIGNVALが4で、LENが4の場合、

前半の式と、後半の式の補数を、AND演算すると、

 7  : 00000111
~3  : 11111100
AND : 00000100 = 4

例5:ALIGNVALが4で、LENが1の場合、

前半の式と、後半の式の補数を、AND演算すると、

 4  : 00000100
~3  : 11111100
AND : 00000100 = 4

履歴

コメント



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS