知識の箱

主に気象を研究する上で得た知識と、WEBページ作成のために得た知識を記録しています。

fortranでbitデータの取扱い3~関数を使ったbit処理~

fortran関数のiandやishftを使うことで、読みだしたビットデータを分解することができる。ishftは循環桁上げなしで論理シフトする。iandは引数のビット単位の論理積を計算する。

ただ、言葉だけでは難しく分かりにくい。

ここでは、具体的な整数を例に、iandとishftの処理を説明する。

ishft(i,j):循環桁上げなしで論理シフトする。

i=13の場合を考える。
i=13はbit表記すると00001101。

jはシフトする数を示している。j>0 のときは左、j

(例1)ishft(13,-2)

00001101を右に2つシフトすることから、(00)000011となる。
つまり1byteで表すと1*1+2*1=3となる。

(例2)ishft(13,4)

00001101を左に4つシフトすることから、000011010000となる。
よって、右から8bit分の1byteで表すと、
1*0+2*0+4*0+8*0+16*1+32*0+64*1+128*1=208となる。

iand(i,j):引数のビット単位の論理積を計算する。

これは、i,jに対応するbitが両方とも1なら1、その他は0になる。

具体的に言うと、

(例3)iand(13,5)

i=13はbit表記だと、00001101
j=5はbit表記だと、00000101

になる。

上記の条件(i,jに対応するbitが両方とも1なら1、その他は0)を見てみると、

00001101
00000101
——–
00000101

右から1つ目と3つ目は両方とも1なので1、右から4つ目は片方だけ1なので0、そのほかはすべて0なので0となる。

結果として得られるbit(00000101)を1byte整数としてみると、1*1+2*0+4*1=5となる。

(例4)iand(12,10)

i=12 –> 00001100
j=10 –> 00001010

iand(12,10)=8 (<==00001000)

ここで、00000011 ==> 3、00001111 ==> 15、 11111111 ==> 255(-125)
などの整数と、ishft、iandを使うことで、1byte(8bit)を分割することができる。

(例5)1byteを最初の4bitと後の4bitに分ける。

1byteをi=[01101010]とすると、前半の4bitは0110、後半の4bitは1010。

ishft(i,-4)

とすると、右に4つシフトされて0110となる(前半部を分離)。つまり1byte整数では5と表示される。

iand(i,15)

i=[01101010]
15=[00001111]

ということで、iand(i,15)=[00001010]となる(後半部を分離)。1byte整数では10と表示される。

この他にもIOR(i,j)やIEOR(i,j)など、様々なbit操作手続きが存在する。