このページを編集する際は、[[解読日記一覧]]の「概要」に従ってください。
*タイトル [#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