GMP整数的位数

时间:2011-02-20 16:12:31

标签: c++ integer biginteger gmp

有没有简单的方法来确定GMP整数的位数?我知道你可以通过日志来确定它,但我想知道库中是否有内置的东西我不知道。我在手册中找到的唯一一件事就是:

_mp_size四肢的数量,或者表示负整数时的负数。         零由_mp_size设置为零表示,在这种情况下_mp_d数据未使用。

但我的印象与我正在寻找的完全不同。

124839 = 6位数。

1 个答案:

答案 0 :(得分:16)

您可以使用size_t mpz_sizeinbase (mpz_t op, int base)获取字符数,以便将该数字作为特定基础中的字符串输出。

  

size_t mpz_sizeinbase(mpz_t op,int base)

     

返回给定基数中的位数测量的op大小。 base可以在2到62之间变化。忽略op的符号,只使用绝对值。结果将是精确的或1太大。如果base是2的幂,则结果总是精确的。如果op为零,则返回值始终为1.

     

此函数可用于确定将op转换为字符串时所需的空间。适当的分配量通常比mpz_sizeinbase返回的值多两个,一个额外用于减号,一个用于空终止符。

这就是:

size_t sz = mpz_sizeinbase (myNum, 10);

应该是一个好的开始。

如果你想要完全大小,你可以使用该值创建一个足够大的缓冲区,将值输出到该缓冲区,然后执行{{1}获得更准确的大小,如:

strlen

请注意,这不是最有效的方法,因为它每次要查找长度时都会分配缓冲区,如果分配失败,则默认为最安全的大小,这可能比必要的大。

另一种可能的方法是使用更安全的size_t sz = mpz_sizeinbase (myNum, 10) + 1; // allow for sign char *buff = malloc (sz + 1); // allow for `\0` if (buff != NULL) { gmp_sprintf (buff, "%Zd", myNum); sz = strlen (buff); free (buff); } 选项,因为它返回写入的字节数,并防止缓冲区溢出:

snprintf

我没有特别测试过,但这是我之前用于“常规”C风格打印的技巧。

请注意,两者这些“精确尺寸”解决方案在前面都包含一个可选标志。如果你想真正计算数字而不是字符,你应该调整它(例如,如果数字小于零,则从大小中减去一个)。