このページを編集する際は、[[解読日記一覧]]の「概要」に従ってください。

*タイトル [#vdf2bd02]

-ソースコードを読むだけでは意味がわからない①

*事例 [#mbed8f35]

-[[TYPEALIGN()/postgresql-8.1.4]]

*課題 [#ob8d73f3]

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

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

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

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

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

*解決方法 [#s04228fd]

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

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

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

**例1:ALIGNVALが4で、LENが9の場合、 [#hc70565d]

-前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (9) + ((4) - 1) = 12
-後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3

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

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

**例2:ALIGNVALが4で、LENが7の場合、 [#lfb358ab]

-前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (7) + ((4) - 1) = 10
-後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3

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

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

**例3:ALIGNVALが4で、LENが5の場合、 [#r3c0e3ab]

-前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (5) + ((4) - 1) = 8
-後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3

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

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

**例4:ALIGNVALが4で、LENが4の場合、 [#zc3e625c]

-前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (4) + ((4) - 1) = 7
-後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3

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

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

**例5:ALIGNVALが4で、LENが1の場合、 [#i18867df]

-前半の式 (long) (LEN) + ((ALIGNVAL) - 1) = (long) (1) + ((4) - 1) = 4
-後半の式 (long) ((ALIGNVAL) - 1) = (long) ((4) - 1) = 3

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

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


*履歴 [#afedb134]

-作者:[[testnoda/ページ作者]]
-日付:2007/2/25

*コメント [#b7843061]

#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS