91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

BigInteger的基本知識是什么

發布時間:2021-10-20 16:27:20 來源:億速云 閱讀:172 作者:柒染 欄目:大數據

BigInteger的基本知識是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

首先我們知道基本類型只能表示一定范圍內的數值。

byte   (-128-127);

long (-9223372036854774808~9223372036854774807)

如果超出范圍了該怎么辦呢?  比如如何來表示 123123456789123456789。

BigInteger的基本知識是什么

更正一下 ,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數組來表示大數

BigInteger的基本知識是什么

以下是計算出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是根本不存在的,如果存在也就不需要再表示了)。

BigInteger的基本知識是什么

((length * 3402 >>> 10 )  +1  + 31 )  >>> 5 ,     為啥這個可以用來估算mag的長度,而且一定比需要的長度大或者等于。 我現在也沒有弄明白,充滿神秘感的東西才是這個世界上最好的東西 。 

BigInteger的基本知識是什么

BigInteger的基本知識是什么

這兩個過程我是看了n多遍才慢慢看懂的 。

接下來的問題:

1:如何將mag數組還原成一個字符串?如果不可逆那么這種表示方式沒有任何意義。

2:如何實現加減乘除等運算 。 

看完上述內容,你們掌握BigInteger的基本知識是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定兴县| 京山县| 贵港市| 玉屏| 灵璧县| 黔西县| 望城县| 庆城县| 康乐县| 柳江县| 崇仁县| 和林格尔县| 资源县| 界首市| 略阳县| 民权县| 桦南县| 阿克陶县| 宾川县| 白山市| 郑州市| 宁强县| 临海市| 枣阳市| 玛沁县| 二手房| 安图县| 溧水县| 武夷山市| 安仁县| 凤庆县| 从化市| 南城县| 龙岩市| 花莲市| 紫云| 萨迦县| 社旗县| 汾阳市| 格尔木市| 祁东县|