您好,登錄后才能下訂單哦!
BigInteger的基本知識是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先我們知道基本類型只能表示一定范圍內的數值。
byte (-128-127);
long (-9223372036854774808~9223372036854774807)
如果超出范圍了該怎么辦呢? 比如如何來表示 123123456789123456789。
更正一下 ,signum 有三個取值 1,0,-1 .
mag 數組的定義是什么?
首先大數 123123456789123456789 對應的二進制為 1101010110010101110011000111001110100011001110111000101111100010101 , 共67位, 從后往前每32個bit位可以當作一個int進行存儲 。 這應該是最節約內存的表示方式了 ,表示這個大數占用了16個字節 。
char[] arr = {'1','2','3','1','2','3','4','5','6','7','8','9','1','2','3','4','5','6','7','8','9'}; 占用42個字節,所以不大會直接用一個char數組來表示大數
以下是計算出mag數組的算法,這是一個非常有意思的處理過程。
相信大家對如何將字符串“123” 轉化為10進制整形123已經很熟悉了
public static void main(String[] args) { String a = "123" ; char[] chars = a.toCharArray() ; int sum = 0; int index = 0; while (index<chars.length){ sum = sum * 10 + chars[index] - '0'; index++; } System.out.println(sum);}
以下轉換思路類似,只是稍微麻煩了一些些 。
1: 將123123456789123456789 分為三組 group0 = 123 , group1 = 123456789, group2 = 123456789 ;
其中group0 的長度為大數的length % 9, 其余 group的長度均為9 , 這個和 java int 的表示范圍有關 。Integer.MAX_VALUE = 2147483647 恰好為10位, 因此每組取9個字符,在parse時不會存在溢出問題 。
int[] num = new int[3] ;
2:
2.1 num[2] = group0的int值 ; num[1] = 0 ; num[0] = 0 ;
2.2.1 long x = num[2] * 10 ^ 9 ; 123000000000 ; 一個long剛好8個字節 ,分為兩個int存儲 , (int) x 為x的后四個字節, x>>>32 為x的前四個字節。
num[2] = (int) x ;
long x = num[1] + x >>> 32 ;
num[1] = (int) x ;
long x = num[0] + x >>> 32 ;
num[0] = (int) x ;
2.2.2 long sum = num[2] + group1的int值
num[2] = (int) sum ;
sum = num[1] + sum >>> 32 ; 有可能有進位
num[1] = (int) sum ;
sum = num[0] + sum >>> 32 ; 有可能有進位
num[0] = (int) sum ;
重復2.2 的兩個過程, 即可將一個字符串(大數)表示為整形數組 。
還有一些很細節的問題, 比如mag數組的大小,如果小了,肯定表示不了大數, 但是如果大了,對上面的算法毫無影響,最后只需去掉數組前面值為0的item即可 。
(2^n > 123123456789123456789 先求出最小的n 然后 【n/32 】 理論上是這樣的,但是這個是無法實現的,因為此時 123123456789123456789是根本不存在的,如果存在也就不需要再表示了)。
((length * 3402 >>> 10 ) +1 + 31 ) >>> 5 , 為啥這個可以用來估算mag的長度,而且一定比需要的長度大或者等于。 我現在也沒有弄明白,充滿神秘感的東西才是這個世界上最好的東西 。
這兩個過程我是看了n多遍才慢慢看懂的 。
接下來的問題:
1:如何將mag數組還原成一個字符串?如果不可逆那么這種表示方式沒有任何意義。
2:如何實現加減乘除等運算 。
看完上述內容,你們掌握BigInteger的基本知識是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。