C 使用OpenSSL'拆分一个数字;s BIGNUM尽可能快

C 使用OpenSSL'拆分一个数字;s BIGNUM尽可能快,c,openssl,bignum,C,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

我使用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可以更有效地实现这一点,但我找不到它


那么,我能做些什么来加快这一速度呢?

您可以使用
BN\u mask\u 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)
则添加检查:

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);
  }
}
void number\u分割(BIGNUM*低位、BIGNUM*高位、BIGNUM*num、long n){
BN_拷贝(低位,num);

if(BN_num_位(num)您的解决方案有一个小小的变化,
BN\u mask\u bits
对num进行了就地修改,它不会将结果放入一个新的结构中,如
BN\u rshift
那样。因此,您必须先将
num
复制到
低位,然后再将
低位
屏蔽,谢谢!这很好!我的应用程序的净速度提高了33%从这里开始。@Luke,哦,是的-我更新了我的答案,在
BN\u-copy()
之前使用
BN\u-mask\u-bits()
。很高兴听到它有帮助!