2016-01-21 36 views
1

我正在使用OpenSSL的BIGNUM庫處理任意精度數字。儘快使用OpenSSL的BIGNUM分割數字

我需要分成兩部分的數字。我需要一個數字中的前n位[0,n-1](我的意思是n個最低有效位),其餘位中的[n,end]位於另一個數中。

我有一個做工程的代碼是這個

void number_split(BIGNUM * first_n_bits, BIGNUM * the_rest, BIGNUM * number, long n) { 
    int i = 0; 

    BN_copy(first_n_bits, number); 

    int bits = BN_num_bits(first_n_bits); 

    while(bits > n) { 
     BN_clear_bit(first_n_bits, --bits); 
    } 

    if(BN_num_bits(number) > n) { 
     BN_rshift(the_rest, number, n); 
    } else { 
     BN_copy(the_rest, zero); 
    } 
} 

我已經確定,這個功能是最大的貢獻者我的應用程序的執行時間之一,所以使得它快一點會幫助我很多。

似乎可以改進的部分是while循環,我一次清除最重要的位。我會認爲BIGNIM會有更高效完成的功能,但我找不到它。

那麼,我能做些什麼來使這個更快?

回答

1

您可以使用BN_mask_bits()函數,該函數應該比遍歷每一位更快。

// BN_num_bits(num) must be >= n 
void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) { 
    BN_copy(low_bits, num); 
    BN_mask_bits(low_bits, n); 
    BN_rshift(high_bits, num, n); 
} 

如果有可能BN_num_bits(num) < n然後添加一個檢查:

void number_split(BIGNUM *low_bits, BIGNUM *high_bits, BIGNUM *num, long n) { 
    BN_copy(low_bits, num); 
    if(BN_num_bits(num) <= n) { 
    BN_copy(high_bits, zero); 
    } else { 
    BN_mask_bits(low_bits, n); 
    BN_rshift(high_bits, num, n); 
    } 
} 
+1

一個小的變化,以您的解決方案,'BN_mask_bits'確實NUM的到位修改,它不把結果像'BN_rshift'這樣的新結構可以。所以,你必須首先將'num'複製到'low_bits'中,然後掩飾'low_bits' – Luke

+1

謝謝!這很好!我的應用程序的淨速度提高了33%。 – Luke

+0

@Luke,哦是的 - 我更新了我的答案,在'BN_mask_bits()'之前使用'BN_copy()'。很高興聽到它的幫助! –