BigInteger的底层数据结构

BigInteger介绍

BigInteger是Java标准库提供的大整数类,提供对整数的各种操作和常用算法。与普通的int和Integer相比,BigInteger可以对大整数进行操作,而Java内置的整形最长的整形是long(64位有符号整数),一旦对需要多于64位的整数(说63位也许更好,因为有一位是符号位)进行处理时就需要BigInteger。

注意BigInteger是不可变的(这里指的是底层数据结构用了final修饰),也就是说,一旦创建就不能改变其数值(一般的处理方法都会返回一个新对象)。

注 : BigInteger所在包为java.math

BigInteger的主要操作

BigInteger以成员方法的形式提供了和整型类似的操作,如add,subtract等等,除此之外还提供abs求绝对值、max/min求最大最小值、gcd求最大公约数等等.

BigInteger的底层数据结构

BigInteger的底层是利用一个int的数组(称为mag)存储大整数,这个int数组存放的是该大整数的所有二进制表示,也就是说,当要存放的整数大于32位时,就会被分割成32位为一组的形式,每一组二进制数就作为底层数组的一个元素。并且,BigInteger的底层数组mag时大端存放的,也就是说mag[0]、mag[1]…mag[mag.length -1]分别代表整数的最高32位、次高32位…最低32位。

并且, BigInteger的mag数组仅仅用来存放绝对值的二进制位,其符号被signum存放,signum为0即代表0;signum为1即代表正数、signum为-1即代表负数。(也就是该底层2进制表示与int并不互通,int有一位是符号位,故最大值只有2147483648 - 1,而BigInteger将符号位提出,故一个其中mag即可存下4294967296 - 1)

BigInteger的成员变量/常量

final int signum; // 符号标志, -1 : 负数, 0 : 零, 1 : 正数

final int[] mag;  // 存放大整数二进制位的数组, 大端存储

附录

大端存储

一、大端模式和小端模式的起源

关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

二、什么是大端和小端
    Big-Endian和Little-Endian的定义如下:
  1. 小端就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  2. 大端就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值