
# BITLIB を移植するときの注意

BITLIB は FORTRAN77 の規格にはないビット列のハンドリングに関する以下の
ルーチンを含んでいる.

  IAND(I1,I2)     : I1 と I2 のビット列のブール積を返す. 
  IOR(I1,I2)      : I1 と I2 のビット列のブール和を返す. 
  ISHIFT(IWORD,N) : IWORD のビット列をNビットシフトする. Nが負なら右に
                    シフトをして左側には0をつめる. Nが正なら左にサイク
                    リックなシフトをする.

しかし, これらはふつう処理系が同じ名前のルーチンを用意しているか, 同じ
名前のものがなくても同じ動作をするものを簡単に書くことができるので, シ
ステム管理者が適切なインターフェイスルーチン用意すること. 以下に, Sun
FORTRAN 1.4 および C 言語で記述した IAND, IOR, ISHIFT の例を示す(これ
は32-bit システムでの例である). なお C 言語で書かれたソースは NCARG に
含まれていたものにもとづいている. 

このパッケージでは C 言語で書かれたものを標準としている. 

*-----------------------------------------------------------------------
*     IAND
*-----------------------------------------------------------------------
      INTEGER FUNCTION IAND(I1,I2)
 
      INTEGER  AND
 
 
      IAND=AND(I1,I2)
 
      END
*-----------------------------------------------------------------------
*     IOR
*-----------------------------------------------------------------------
      INTEGER FUNCTION IOR(I1,I2)
 
      INTEGER  OR
 
 
      IOR=OR(I1,I2)
 
      END
*-----------------------------------------------------------------------
*     ISHIFT
*-----------------------------------------------------------------------
      INTEGER FUNCTION ISHIFT(IWORD,N)

      INTEGER  OR

 
      IF (N.GT.0) THEN
        NS=MOD(N,32)
        ILFT=ISHFT(IWORD,NS)
        IRGT=ISHFT(IWORD,NS-32)
        ISHIFT=OR(ILFT,IRGT)
      ELSE
        ISHIFT=ISHFT(IWORD,N)
      END IF
 
      END

/*
 *	iand
 */
long iand_(i, j)
    long *i, *j;
{
    return (*i & *j);
}

/*
 *	ior
 */
long ior_(i, j)
    long *i, *j;
{
    return (*i | *j);
}

/*
 *	ishift
 */
long ishift_(i, nshift)
    long *i, *nshift;
{
    long jshift, nbits;

    if (*nshift < 0) {
	nbits = (*nshift < -32 ? 32 : -*nshift);
	jshift = (*i >> nbits) & (017777777777 >> (nbits - 1));
    }
    else {
	nbits = *nshift % 32;
	jshift = (*i << nbits) | ((*i >> (32 - nbits))
				  & (~(037777777777 << nbits)));
    }
    return (jshift);
}
