有效获取 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
我无法找到 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