有效获取 mpz_t 结构的最高有效字节

Effectively get the most significant byte of mpz_t struct

我无法找到 gmpxx 如何在幕后存储 mpz_t 结构。因此,将数字的最高有效字节存储为 mpz_t 的唯一方法是使用 mpz_get_str 方法,但我预计它会非常慢。

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

我的意思是二进制数的 'most significant byte'(在我的例子中保存为 mpz_t)。 IE。对于 12345 (10) = 11000000111001 (2) 它将是 11000000,无论 gmpxx 实际存储它。

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

这里有两个函数要看: size_t mpz_sizeinbase(mpz_t op, int base):这个returns是一个基数的长度,对于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 结构存储在 "limbs" 中,它们是链接在一起的原语。这些肢体可以有前导 0,以便更容易地编辑数字以进行较小的值更改 - 因此不建议直接访问它们。

A limb means the part of a multi-precision number that fits in a single machine word. (We chose this word because a limb of the human body is analogous to a digit, only larger, and containing several digits.) Normally a limb is 32 or 64 bits. The C data type for a limb is mp_limb_t. ~https://gmplib.org/manual/Nomenclature-and-Types.html#Nomenclature-and-Types