2013-03-12 21 views
0

我想實現一個高效的庫,用於在大整數上按位運算。我已經寫了下面的函數,它覆蓋BTEST爲n字節整數實現按位運算的最佳方法

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

是您的BTEST太慢?你的問題至少要快一點嗎?對於哪個編譯器? – 2013-03-12 14:15:13

+0

是的,上面的實現成爲我的代碼中的一個瓶頸。我正在使用ifort。 – delete000 2013-03-12 14:23:39

回答

3

我不知道這是否比你的版本更快,我會讓你去測試它,但它涉及更少的操作,並且沒有明確的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 

請注意,我用現在標準的那種聲明int64int16

+0

主要的區別是避免IF(因此沒有數組溢出檢查,這將更快)。無論如何,乘法和除法將被編譯來轉移指令。 – 2013-03-12 19:36:48

+0

非常感謝,我的代碼現在運行速度提高了〜10%。 – delete000 2013-03-31 22:31:43