Crikey。好吧,首先,如何實現bignums:在GMP和其他庫中,通常您將固定寬度字段指定爲「肢體」或數字的一部分。到目前爲止,你已經有了這個部分,除了你更可能分別在32位和64位平臺上使用uint32_t
或uint64_t
,因爲這些是寄存器和指令的大小,如adc
設置進位標誌,如果增加兩個寄存器溢出。
無論如何,重要的是,這些肢體代表了bignum的實際量級,而不是它的符號。使用二進制補碼,我們希望在某個位置有一個符號位,但是如果您想調整一個數字的大小(並且adc
不關心簽名,它只是執行二進制加法)會變得很亂,因爲您需要找到舊的符號位,提取它,記住它,然後將它放回到正確的位置...非常緩慢。
我不確定你想要實現的是顛倒每個肢體中的位。如果你想像一套四肢像這樣的(以下簡稱簡單)
1011 0111 1010 1011 = 47019
你會結束:
0100 1000 0101 0100 = 18516
反正GMP不代表四肢跡象。在GMP的符號整型是mpz_t
這是由這個結構定義:
typedef struct
{
int _mp_alloc; /* Number of *limbs* allocated and pointed
to by the _mp_d field. */
int _mp_size; /* abs(_mp_size) is the number of limbs the
last field points to. If _mp_size is
negative this is a negative number. */
mp_limb_t *_mp_d; /* Pointer to the limbs. */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
因此,大家可以看到,_mp_size
是GMP如何代表符號數。
在代碼中(具體而言,mpz/aors.h
),你會看到這樣使用:
usize = u->_mp_size;
vsize = VARIATION v->_mp_size;
// .....
if ((usize^vsize) < 0)
{
/* U and V have different sign. Need to compare them to determine
which operand to subtract from which. */
// does subtraction instead of add.
的實際操作是由mpn_
系列這是你的無符號類型的函數執行。
GMP有許多基本類型的導入/導出功能,可以讓您正確設置尺寸。我不太清楚你想要做什麼,但假設他們不足,你應該可以自己設定。
你的代碼實際上並沒有做任何事情,因爲你放棄了'〜mynumber [i]'表達式的結果。 –
我寫得不好,但問題是另一個。 – Gianluca
複製和粘貼實際代碼總是比較好,而不是輸入近似值。 –