【发布时间】:2016-01-21 17:54:18
【问题描述】:
我将 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 会有一个更有效地完成此任务的功能,但我找不到它。
那么,我该怎么做才能加快速度呢?
【问题讨论】: