我想为大整数上的按位运算实现一个高效的库。我编写了以下覆盖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)
位。有没有更有效的方法来获得相同的功能?
答案 0 :(得分:3)
我不知道这是否比你的版本更快,我会让你去测试,但它涉及的操作更少,而且没有明确的if语句。它给出了与我运行的少数测试的代码相同的结果。我已经用64位硬连接了bignum中整数的大小,你可以根据需要设置一个参数。
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