知識の箱
主に気象を研究する上で得た知識と、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操作手続きが存在する。