BigInteger的基本知識是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
創(chuàng)新互聯(lián)建站是專業(yè)的平桂網(wǎng)站建設(shè)公司,平桂接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行平桂網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
首先我們知道基本類型只能表示一定范圍內(nèi)的數(shù)值。
byte (-128-127);
long (-9223372036854774808~9223372036854774807)
如果超出范圍了該怎么辦呢? 比如如何來表示 123123456789123456789。
更正一下 ,signum 有三個取值 1,0,-1 .
mag 數(shù)組的定義是什么?
首先大數(shù) 123123456789123456789 對應的二進制為 1101010110010101110011000111001110100011001110111000101111100010101 , 共67位, 從后往前每32個bit位可以當作一個int進行存儲 。 這應該是最節(jié)約內(nèi)存的表示方式了 ,表示這個大數(shù)占用了16個字節(jié) 。
char[] arr = {'1','2','3','1','2','3','4','5','6','7','8','9','1','2','3','4','5','6','7','8','9'}; 占用42個字節(jié),所以不大會直接用一個char數(shù)組來表示大數(shù)
以下是計算出mag數(shù)組的算法,這是一個非常有意思的處理過程。
相信大家對如何將字符串“123” 轉(zhuǎn)化為10進制整形123已經(jīng)很熟悉了
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);}
以下轉(zhuǎn)換思路類似,只是稍微麻煩了一些些 。
1: 將123123456789123456789 分為三組 group0 = 123 , group1 = 123456789, group2 = 123456789 ;
其中g(shù)roup0 的長度為大數(shù)的length % 9, 其余 group的長度均為9 , 這個和 java int 的表示范圍有關(guān) 。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個字節(jié) ,分為兩個int存儲 , (int) x 為x的后四個字節(jié), x>>>32 為x的前四個字節(jié)。
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 的兩個過程, 即可將一個字符串(大數(shù))表示為整形數(shù)組 。
還有一些很細節(jié)的問題, 比如mag數(shù)組的大小,如果小了,肯定表示不了大數(shù), 但是如果大了,對上面的算法毫無影響,最后只需去掉數(shù)組前面值為0的item即可 。
(2^n > 123123456789123456789 先求出最小的n 然后 【n/32 】 理論上是這樣的,但是這個是無法實現(xiàn)的,因為此時 123123456789123456789是根本不存在的,如果存在也就不需要再表示了)。
((length * 3402 >>> 10 ) +1 + 31 ) >>> 5 , 為啥這個可以用來估算mag的長度,而且一定比需要的長度大或者等于。 我現(xiàn)在也沒有弄明白,充滿神秘感的東西才是這個世界上最好的東西 。
這兩個過程我是看了n多遍才慢慢看懂的 。
接下來的問題:
1:如何將mag數(shù)組還原成一個字符串?如果不可逆那么這種表示方式?jīng)]有任何意義。
2:如何實現(xiàn)加減乘除等運算 。
看完上述內(nèi)容,你們掌握BigInteger的基本知識是什么的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
文章標題:BigInteger的基本知識是什么
文章地址:http://m.newbst.com/article18/ggpedp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、網(wǎng)站排名、網(wǎng)站改版、網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)