我无法找到gmpxx
如何将mpz_t
结构存储在引擎盖下。因此,将数字的最高有效字节存储为mpz_t
的唯一方法是使用mpz_get_str
方法,但我希望它非常慢。
你知道一种更有效(和简单)的方法吗?
我指的是最重要的字节'二进制中的数字(在我的情况下保存为mpz_t
)。即对于12345(10)= 11000000111001(2)它将是11000000,无论gmpxx
实际存储它。
答案 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的定义。