我想实现一个对大整数进行位操作的高效库。我已经编写了下面的函数来覆盖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)
位。是否有更有效的方法来获得相同的功能?
我不知道这是否比你的版本快,我让你测试一下,但它涉及的操作更少,没有显式的if语句,所以可能是。对于我运行的几个测试,它给出了与代码相同的结果。我已经把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
注意,我使用了现在标准的类型声明int64
和int16