BigInteger 的一些基本知识

Stella981
• 阅读 386

首先我们知道基本类型只能表示一定范围内的数值。

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:如何实现加减乘除等运算 。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这