0

大きな整数に対するビット単位の演算用の効率的なライブラリを実装したいと考えています。をオーバーライドする次の関数を作成しましたBTEST

FUNCTION testb_i2b(n,i)
  INTEGER(I8B), DIMENSION(0:), INTENT(IN) :: n
  INTEGER(I2B), INTENT(IN) :: i
  INTEGER(I2B) :: j
  LOGICAL :: testb_i2b
  j = ISHFT(i,-6)
  IF ( j .LE. UBOUND(n,1) ) THEN
    testb_i2b = BTEST(n(j),i-ISHFT(j,6))
  ELSE
    testb_i2b = .FALSE.
  END IF
END FUNCTION testb_i2b

配列には、大きな整数のビットがn含まれています。64*(SIZE(n)-1)同じ機能を得るより効率的な方法はありますか?

4

1 に答える 1

3

これがあなたのバージョンよりも速いかどうかはわかりません。それをテストするためにあなたに任せますが、操作が少なく、明示的な if ステートメントがない可能性があります。私が実行したいくつかのテストのコードと同じ結果が得られます。bignum の整数のサイズを 64 ビットに固定しました。必要に応じて、それをパラメーターにすることができます。

  LOGICAL FUNCTION btest_bignum(bn,ix)
    IMPLICIT NONE
    INTEGER(int64), DIMENSION(0:), INTENT(in) :: bn
    INTEGER(int16), INTENT(in) :: ix
    INTEGER :: array_ix
    array_ix = ix/64
    btest_bignum = BTEST(bn(array_ix), ix-(array_ix*64))
  END FUNCTION btest_bignum

ここでは標準の kind 宣言を使用していることに注意してくださいint64int16

于 2013-03-12T16:18:01.740 に答える