BigInteger的基本知识是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。首先我们知道基本类型只能表示一定范围内的数值。byte (-128-127);long (-9223372036854774808~9223372036854774807)如果超出范围了该怎么办呢? 比如如何来表示 123123456789123456789。更正一下 ,signum 有三个取值 1,0,-1 .mag 数组的定义是什么?首先大数 123123456789123456789 对应的二进制为1101010110010101110011000111001110100011001110111000101111100010101 , 共67位, 从后往前每32个bit位可以当作一个int进行存储 。 这应该是最节约内存的表示方式了 ,表示这个大数占用了16个字节 。以下是计算出mag数组的算法,这是一个非常有意思的处理过程。相信大家对如何将字符串“123” 转化为10进制整形123已经很熟悉了以下转换思路类似,只是稍微麻烦了一些些 。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的基本知识是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注开发云行业资讯频道,感谢各位的阅读!
怎么看待Servlet和Jsp知识点,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。tomcat,mysql,Navicat For mysql,eclipse(javaee)注意是…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。