有效地获取mpz_t结构的最重要字节

时间:2017-11-03 17:28:43

标签: c++ gmp

我无法找到gmpxx如何将mpz_t结构存储在引擎盖下。因此,将数字的最高有效字节存储为mpz_t的唯一方法是使用mpz_get_str方法,但我希望它非常慢。

你知道一种更有效(和简单)的方法吗?

我指的是最重要的字节'二进制中的数字(在我的情况下保存为mpz_t)。即对于12345(10)= 11000000111001(2)它将是11000000,无论gmpxx实际存储它。

2 个答案:

答案 0 :(得分:1)

这里有两个功能: size_t mpz_sizeinbase(mpz_t op, int base):这会返回基数中的长度,对于base=2,它会给出位数。 void mpz_tdiv_r_2exp (mpz_t r, const mpz_t n, mp_bitcnt_t b):这相当于r = n >> b;。 结合起来,您正在寻找的操作是精确地向右移sizeinbase-8次:

size_t bit_length = mpz_sizeinbase(number, 2);
mpz_tdiv_r_2exp(last_byte, number, bit_length-8);

作为旁注,mpz_t结构存储在“肢体”中,它们是链接在一起的基元。这些肢体可以有前导0来使编辑数字更容易进行小值更改 - 因此不建议直接访问它们。

  

肢体是指适合单个机器单词的多精度数字的一部分。 (我们之所以选择这个词是因为人体的肢体类似于数字,只是更大,并且包含几个数字。)通常肢体是32或64位。肢体的C数据类型是mp_limb_t。   〜https://gmplib.org/manual/Nomenclature-and-Types.html#Nomenclature-and-Types

答案 1 :(得分:-2)

您可以创建一个没有填充的联合(请参阅#pragma pack effect),其中包含2个成员:结构和一个字节,然后为结构赋值,然后读取字节的值。但是,我不确定它是否适合您对MSB的定义。