我正在使用OpenSSL的BIGNUM库来获取任意精度数字。
我需要将一个数字分成两部分。我需要一个数字中的前n位[0,n-1](我的意思是n个最低有效位),其余的位[n,end]在另一个数字中。
我所拥有的代码就是这个
// refer to the test definitions in the function testObject(browser)
it('sample test case', function(done) {
return testObject(browser)
.then(done);
});
我已经确定这个函数是我的应用程序执行时间的最大贡献者之一,所以让它快一点会对我有所帮助。
似乎可以改进的部分是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);
}
}
循环,我一次清除一个最重要的位。我本以为BIGNIM会有更高效地完成它的功能,但是我找不到它。
那么,我能做些什么来加快速度呢?
答案 0 :(得分: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);
}
}