使用 GMP 获取数字的二进制后缀的最有效方法是什么?
What's the most efficient possible way to get the binary suffix of a number with GMP?
我想将 x % 2^n
加载到另一个 mpz_t 中。我不清楚 mpz_mod
(manual) 是否会比类似的东西更快:
mpz_t setSuffix(int n,mpz_t x){
mpz_t y;
mpz_init_set_ui(y,0);
for(int i=0;i<n;i++){
if(mpz_tstbit(x,i)){
mpz_setbit(y,i);
}
}
return y;
}
我可以在这里使用一些内置功能做得更好吗,或者这是速度限制? 运行 向后循环可能会更快,因此分配只会完成一次。
- 计算n/64,n%64.
- 传输 (n/64) 次 64 位整数。
- 单独传输 (n%64) 位。
额外的优化(而不是上面的 3.):
- 计算(n%64)/32、(n%64)/16、(n%64)/8。
- 如果其中任何一个大于 0(即等于 1),则一次复制该数据量。
- 单独传输剩余的 (n%64)%8 位。
它可能仍然比 4.-6 更快。以上如果:
- 你只计算了(n%64)/8,(n%64)%8
- 传输 (n%64)/8 字节
- 传输(n%64)%8位
从这里开始,进行一些基准测试并根据需要进行改进。
注意:我假设你有一个 64 位系统。对于较旧的系统,请根据需要进行调整。此外,上面的一些数学可能需要一些调整(在步骤 4.-6.)。
我想将 x % 2^n
加载到另一个 mpz_t 中。我不清楚 mpz_mod
(manual) 是否会比类似的东西更快:
mpz_t setSuffix(int n,mpz_t x){
mpz_t y;
mpz_init_set_ui(y,0);
for(int i=0;i<n;i++){
if(mpz_tstbit(x,i)){
mpz_setbit(y,i);
}
}
return y;
}
我可以在这里使用一些内置功能做得更好吗,或者这是速度限制? 运行 向后循环可能会更快,因此分配只会完成一次。
- 计算n/64,n%64.
- 传输 (n/64) 次 64 位整数。
- 单独传输 (n%64) 位。
额外的优化(而不是上面的 3.):
- 计算(n%64)/32、(n%64)/16、(n%64)/8。
- 如果其中任何一个大于 0(即等于 1),则一次复制该数据量。
- 单独传输剩余的 (n%64)%8 位。
它可能仍然比 4.-6 更快。以上如果:
- 你只计算了(n%64)/8,(n%64)%8
- 传输 (n%64)/8 字节
- 传输(n%64)%8位
从这里开始,进行一些基准测试并根据需要进行改进。
注意:我假设你有一个 64 位系统。对于较旧的系统,请根据需要进行调整。此外,上面的一些数学可能需要一些调整(在步骤 4.-6.)。