#1です、専門家と称した手前、もう少しヒントを。
Cなら簡単ですが、FORTRANでも手数は掛かりますが可能です。アセンブラのサブルーチンを作ってしまうのが一番簡単ですが、言語仕様の範囲で考えてみました。
FORTRAN90で、一応、規格にある関数なので使えると思います。言語仕様で論理式は使えないようですので、関数を使います。なお、シフト演算は符号の問題があるので算術演算ではなく、論理関数を使っています。先頭ビットが必ずゼロなら2の冪乗定数を使って除してしまうのが高速でしょう。
たとえば2バイト整数の前12ビットを取り出す場合
INTEGER*2 MASK12 / ZFFF0 /
INTEGER*2 DATA, DATA12
READ (xx) DATA
DATA12 = ISHIFT(IAND(DATA,MASK12),4)
ここで、IAND(DATA,MASK12)で後ろ4ビットを0にし、ISHIFTで4ビット右にシフトしています(FORTRANにはunsignedの概念がないので数値演算では出来ません)。
で、これで、2ワードに渡る領域を取り出したいとき(最初のワードの後ろ4ビットと次のワードの前8ビットの例)
INETGER*2 MASK4 / Z000F /, MASK8 / ZFF00 /
INTEGER*2 DATA1, DATA2, DATA12
READ (xx) DATA1, DATA2
DATA12 = IOR(ISHIFT(IAND(DATA1,MASK4),-8), ISHIFT(IAND(DATA2,MASK8),8))
ちゃんとデバッグしていないので怪しいのですが、こんな感じで論理演算の関数を駆使してみてください。
処理系によっては、INTEGER*2では関数が上手く動かない場合もあるかと思いますが、その場合は、INTEGER*4で応用してたください。考え方は同じです。
実際にはCでしかできないということはそれほどありません、本当のプロはCOBOLでもFORATRANでも手立てを講じることが出来ます。そりを目指してみてください。
お礼
お礼が遅くなりすみません。fortran90以上だとbit演算が出来るんですね。 >本当のプロはCOBOLでもFORATRANでも手立てを講じることが出来ます。 道のりは遠いですが、目指したいです。 ありがとうございました。