整数データ型は,内部的には 2 進数の 2 の補数表現で表現されています。2 進表現におけるビット位置は,右 (最下位ビット) から左 (最上位ビット) へと番号が付けられます。一番右のビット位置が 0 という番号になります。
組込み関数 IAND,IOR,IEOR,および NOT は,いずれもその引数のすべてのビットに作用します。結果のビット 0 は,指定された論理演算を引数のビット 0 に適用することによって得られます。結果のビット 1 は,指定された論理演算を引数のビット 1 に適用することによって得られます (以下同様)。
関数 ISHFT と ISHFTC は 2 進パターンをけた移動させます。
関数 IBSET,IBCLR,BTEST,および IBITS と,サブルーチン MVBITS は,ビット・フィールドに作用します。
ビット・フィールドとは,2 進パターン中の連続したビットの組のことです。ビット・フィールドは,開始ビット位置と長さによって指定されます。ビット・フィールドはその演算対象に完全に含まれていなくてはなりません。
たとえば,整数 47 は次のように表現されます。
2 進パターン | 0...0101111 |
ビット位置 | n...6543210 |
n は,数値記憶単位に含まれるビット位置の数です。 |
ビット 3 ~ 6 に含まれているビット・フィールドは,開始位置を 3,長さを 4 と指定することで引用できます。
負の整数は,2 の補数表現によって表現されます。たとえば,整数 -47 は次のように表現されます。
2 進パターン | 1...1010001 |
ビット位置 | n...6543210 |
n は,数値記憶単位に含まれるビット位置の数です。 |
ビット位置 n の値は次のようになります。
負の数値の場合は 1 非負の数値の場合は 0
パターン中の値の最上位ビットからビット n までのすべての上位ビットは,ビット n と同じです。
IBITS と MVBITS は一般ビット・フィールドに作用します。これらの組込み関数には,ビット・フィールドの開始位置と長さの両方が引数として渡されます。IBSET,IBCLR,および BTEST は 1 ビット・フィールドに作用します。これらの関数は長さの引数を必要としません。
IBSET,IBCLR,および BTEST のビット位置範囲は次のとおりです。
INTEGER(8) と LOGICAL(8) については 0 ~ 63
INTEGER(4) と LOGICAL(4) については 0 ~ 31
INTEGER(2) と LOGICAL(2) については 0 ~ 15
BYTE,INTEGER(1),および LOGICAL(1) については 0 ~ 7
IBITS の場合,ビット位置には任意の数値を指定することができます。長さ範囲は,Alpha および ia64 プロセッサーでは 0 ~ 63,ia32 プロセッサーでは 0 ~ 31 です。
次の例は,IBSET,IBCLR,および BTEST を示しています。
I = 4 J = IBSET (I,5) PRINT *, 'J = ',J K = IBCLR (J,2) PRINT *, 'K = ',K PRINT *, 'Bit 2 of K is ',BTEST(K,2) END
結果は,J = 36,K = 32,K のビット 2 は F です。
性能と必要なメモリーの最適な選択が可能になるように,Compaq Fortran は以下の整数データ型を用意しています。
データ型 | 必要な記憶域 (バイト数) |
---|---|
INTEGER(1) | 1 |
INTEGER(2) | 2 |
INTEGER(4) | 4 |
INTEGER(8) | 8 |
個々のビット操作関数は,これらすべての整数型に作用する総称形式と,個々の型のための個別形式を持っています。
ビット位置を引用したり,記憶単位中の 2 進パターンを移動させる組込み関数を指定するときには,そのデータ型によって表現可能な整数の範囲外にある値を作り出さないように注意してください。移動しようとしているオブジェクトの大きさよりも大きいか,それと等しい量だけ移動を行った場合の結果は 0 となります。
次に例を示します。
INTEGER(2) I,J I = 1 J = 17 I = ISHFT(I,J)
変数 I と J は INTEGER(2) 型です。このため,ISHFT 総称関数は,INTEGER(2) の結果を返す IISHFT 個別関数にマップされます。INTEGER(2) の結果は -32768 ~ 32767 の範囲になくてはなりませんが,値 1 を左に 17 けただけ移動すると,2 進パターン 1 の後に 17 個のゼロが続いたもの,すなわち整数値 131072 が得られます。この例の場合,I 中の結果は 0 になります。
上の例は,I が INTEGER(4) であれば有効となります。その場合,ISHFT は,INTEGER(4) の値を返す JISHFT 個別関数にマップされるからです。
ISHFT が定数の第 1 引数を宣言して呼び出された場合,その結果は基本整数型の大きさと,第 1 引数を含むことができる最小の整数の大きさのどちらか大きい方になります。