使用 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;
}

(bit manipulation functions)

我可以在这里使用一些内置功能做得更好吗,或者这是速度限制? 运行 向后循环可能会更快,因此分配只会完成一次。

  1. 计算n/64,n%64.
  2. 传输 (n/64) 次 64 位整数。
  3. 单独传输 (n%64) 位。

额外的优化(而不是上面的 3.):

  1. 计算(n%64)/32、(n%64)/16、(n%64)/8。
  2. 如果其中任何一个大于 0(即等于 1),则一次复制该数据量。
  3. 单独传输剩余的 (n%64)%8 位。

它可能仍然比 4.-6 更快。以上如果:

  1. 你只计算了(n%64)/8,(n%64)%8
  2. 传输 (n%64)/8 字节
  3. 传输(n%64)%8位

从这里开始,进行一些基准测试并根据需要进行改进。


注意:我假设你有一个 64 位系统。对于较旧的系统,请根据需要进行调整。此外,上面的一些数学可能需要一些调整(在步骤 4.-6.)。