超長整數的基礎運算 演算法實現之進製轉換篇

2021-06-27 04:38:47 字數 1048 閱讀 2114

十進位制轉二進位制

由於單個「位」採用的是216-1作為理論最大值,因此在本次大整數的表示過程中每個類似「十進位制」位可採用16位的二進位制來表示,符號位單獨表示。

「十」進製轉換成二進位制,實際上是經過中間狀態(即大整數的邏輯儲存表示)轉化。在轉換過程中大整數的每個「位」無耦合,不存在依賴關係,因此實現方式較為單一,即採用十進位制數進行不斷除2得餘數的方式組成二進位制的結果。需要特別注意的是二進位制字串不足16位的需要在高位用「0」補齊至16位。

由於遍歷大整數(從低位開始)表示的關係(整數的高位在陣列下標的高位),所以對得出結果的二進位制字串進行整體反轉。為了一般表示的需要,如果翻轉後串的左邊起始字元對零進行過濾,因為這些零沒有實際意義。

// 十進位制轉換為二進位制

char* dectobinhbint(hbigint* src)

} if(src->sign == -1) else res[index*bit_pre_word]='\0';

reverstr(res); // 倒序字串

trimleft(res); // 左邊無意義的「0」字元,直至字元「1」出現

return res;

}

二進位制轉化十進位制

實現原理先將字串從右至左分割成16個固定字元長度的段,如果最後不足16位的不需要補齊,因為遍歷二進位制字串時,當超出字串長度時不會再繼續遍歷,因此不會有溢位的情況。設定乙個反覆計數器,對達到16位後的段進行和累加,並用大整數設定當前的表示位為累加的和,並且復位計數器(置0)。最後一組16個字串(可能不足16位),根據實際的長度遍歷到最後乙個字元(肯定是1)為止。

// 二進位制轉換為十進位制

int bintodechbint(char* bin, hbigint* src)

j++; }

if(str_len%bit_pre_word) src->pbigint[i++] = cur_num;

src->length = i;

return return_ok_bint;

}

小結:

超長整數的基礎運算 演算法實現之加 減篇

上篇介紹了基礎的表示結構以及函式介紹,本篇將開始介紹加減實現的過程。由於整數有正負之分,所以兩個整數相加有四種情況 a b,a b a b和 a b 對於a b和 a b 可以通過對陣列對應位元素相加即可,主要是考慮進製問題。而a b 和 a b,其實就是兩個大整數的減法,其主要考慮的問題是向高位借...

C語言實現二叉排序樹的基本運算演算法

二叉排序樹的建立 查詢和刪除過程及其演算法設計。1 由關鍵字序列 4,9,0,1,8,6,3,5,2,7 建立一棵二叉排序樹bt並以括號表示法輸出 2 判斷bt是否為一棵二叉排序樹 3 採用遞迴和非遞迴兩種方法查詢關鍵字6的節點,並輸出其查詢路徑 4 分別刪除bt中關鍵字為4和5的結點,並輸出刪除後...

2 只用位運算不用演算法運算實現整數的加減乘除運算

寫乙個函式,求兩個整數之和,要求在函式體內不得使用 四則運算符號。結論性思路 1.不考慮進製 a b就是正確答案。其中 是異或操作,即相同 0,不同 1 舉例1 0 1 1 二進位制 0000 0001 0001 0 1 1 舉例2 7 5 12 不進製情況下,7 5個位數為2,0111 0101 ...