BigInteger

news/2024/11/14 23:21:01/文章来源:https://www.cnblogs.com/Chengkai730/p/18547103

对象一旦创建, 内部记录的值是不能发生改变的.

图片名称

程序示例:

public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围: [0~ 2 的 num 次方 -1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 1. 获取一个随机的大整数Random r = new Random();BigInteger bd1 = new BigInteger(4, r);System.out.println(bd1);  // [0 ~ 15]}
}

程序示例:

public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围:[0~ 2的num次方-1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 2.获取一个指定的大整数, 可以超出 long 的取值范围// 细节: 字符串中必须是整数, 否则会报错// BigInteger bd2 = new BigInteger("1.1");  // NumberFormatException: For input string: "1.1"// System.out.println(bd2);// BigInteger bd3 = new BigInteger("abc");  // NumberFormatException: For input string: "abc"// System.out.println(bd3);}
}

程序示例:

public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围:[0~ 2的num次方-1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 3.获取指定进制的大整数// 细节:// 1.字符串中的数字必须是整数// 2.字符串中的数字必须要跟进制吻合. // 比如二进制中, 那么只能写 0 和 1, 写其他的就报错. BigInteger bd1 = new BigInteger("100", 10);System.out.println(bd1);  // 100BigInteger bd2 = new BigInteger("100", 2);System.out.println(bd2);  // 4// BigInteger bd4 = new BigInteger("123", 2);  // NumberFormatException: For input string: "123" under radix 2// System.out.println(bd4);}
}

valueOf() 方法只能接受 long 类型的参数, 参数范围超过了 long 的话, 方法无法接受, 就报错了.

程序示例:

import java.math.BigInteger;public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围:[0~ 2的num次方-1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 4.静态方法获取BigInteger的对象, 内部有优化// 细节:// 1.能表示范围比较小, 只能在long的取值范围之内, 如果超出long的范围就不行了. BigInteger bd1 = BigInteger.valueOf(100);System.out.println(bd1);  // 100BigInteger bd2 = BigInteger.valueOf(10000000000000000000000000L);  // Long number too large, java: 整数太大System.out.println(bd2);}
}

程序示例:

import java.math.BigInteger;public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围:[0~ 2的num次方-1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 4.静态方法获取 BigInteger 的对象, 内部有优化// 细节:// 2.在内部对常用的数字: -16 ~ 16 进行了优化. // 提前把 -16 ~ 16 先创建好 BigInteger 的对象, 如果多次获取不会重新创建新的. BigInteger bd5 = BigInteger.valueOf(16);BigInteger bd6 = BigInteger.valueOf(16);System.out.println(bd5 == bd6); // trueBigInteger bd7 = BigInteger.valueOf(17);BigInteger bd8 = BigInteger.valueOf(17);System.out.println(bd7 == bd8); // false}
}

查看 BigInteger 的源码:

存储 -16 ~ 16 这些 BigInteger 对象的方式:

图片名称

0 这个 BigInteger 对象:

图片名称

valueOf() 方法:

图片名称

程序示例:

public class demo1 {public static void main(String[] args) {/** public BigInteger(int num, Random rnd) 获取随机大整数, 范围:[0~ 2的num次方-1]* public BigInteger(String val) 获取指定的大整数* public BigInteger(String val, int radix) 获取指定进制的大整数** public static BigInteger valueOf(long val) 静态方法获取 BigInteger 的对象, 内部有优化** 细节:* 对象一旦创建里面的数据不能发生改变. */// 5.对象一旦创建内部的数据不能发生改变BigInteger bd9 = BigInteger.valueOf(1);BigInteger bd10 = BigInteger.valueOf(2);// 此时, 不会修改参与计算的 BigInteger 对象中的值, 而是产生了一个新的 BigInteger 对象记录结果 3BigInteger result = bd9.add(bd10);System.out.println(result);  // 3System.out.println(bd9 == result);  // falseSystem.out.println(bd10 == result);  // false}
}

BigInteger 类的常用的成员方法:

图片名称

程序示例:

import java.math.BigInteger;public class demo2 {public static void main(String[] args) {/*public BigInteger add(BigInteger val) 加法public BigInteger subtract(BigInteger val) 减法public BigInteger multiply(BigInteger val) 乘法public BigInteger divide(BigInteger val) 除法, 获取商public BigInteger[] divideAndRemainder(BigInteger val) 除法, 获取商和余数public boolean equals(Object x) 比较是否相同public BigInteger pow(int exponent) 次幂public BigInteger max/min(BigInteger val) 返回较大值/较小值public int intValue(BigInteger val) 转为int类型整数, 超出范围数据有误*/// 1.创建两个BigInteger对象BigInteger bd1 = BigInteger.valueOf(10);BigInteger bd2 = BigInteger.valueOf(3);// 2.加法BigInteger bd3 = bd1.add(bd2);System.out.println(bd3);  // 13// 3.除法, 获取商和余数BigInteger[] arr = bd1.divideAndRemainder(bd2);System.out.println(arr[0]);  // 3System.out.println(arr[1]);  // 1// 4.比较是否相同BigInteger bd4 = BigInteger.valueOf(10);BigInteger bd5 = BigInteger.valueOf(10);boolean equal1 = bd4.equals(bd5);System.out.println(equal1);  // trueBigInteger bd6 = BigInteger.valueOf(10);BigInteger bd7 = BigInteger.valueOf(1);boolean equal2 = bd6.equals(bd7);System.out.println(equal2);  // false// 5.次幂BigInteger bd8 = bd1.pow(2);System.out.println(bd8);// 6.maxBigInteger bd9 = bd1.max(bd2);System.out.println(bd9);System.out.println(bd9 == bd1);  // trueSystem.out.println(bd9 == bd2);  // false// 说明没有创建新的 BigInteger 对象, 而是返回了比较大的那个值// 7.转为 int 类型整数, 超出范围数据有误BigInteger bd10 = BigInteger.valueOf(2147483647L);int i1 = bd10.intValue();System.out.println(i1);  // 2147483647BigInteger bd11 = BigInteger.valueOf(2147483648L);int i2 = bd11.intValue();System.out.println(i2);  // -2147483648, 出错了BigInteger bd12 = BigInteger.valueOf(200);double v = bd12.doubleValue();System.out.println(v);  // 200.0// 还有 longValue(), floatValue() 等方法}
}

BigInteger 底层存储方式:

对于计算机而言, 其实是没有数据类型的概念的, 都是 0101010101.

数据类型是编程语言自己规定的.

这是一个超过 long 类型的数字以及它的二进制补码:

图片名称

进入 BigInteger 的源码:

图片名称

signum 成员变量表示 BigInteger 表示的数字的符号, 若 signum 是 -1, 则表示数字为负数, 若 signum 是 0, 则表示这个数字是 0, 若 sugnum 是 1, 则表示这个数字是正数.

图片名称

mag 这个数组存储的就是数据, 由于数据很大, 所以将其拆分, 将一个很大的数拆成很多个小段, 每一个小段都会放到一个数组当中.

图片名称

signum 和 mag 两种方式相结合, 就能表示大数字.

通过打断点的方式查看 BigInteger 对象:

图片名称

Java 中, 数组是有最大长度的, 数组的最大长度是 int 的最大值: 2147483647.

在真实情况下, 电脑的内存一般是扛不住这么大的数组的, 即电脑的内存无法创建这么大的数组.

在此处, mag 数组是 int 类型的. 因此, 数组中每一位能表示的数字: -2147483648 ~ 2147483647

于是可以说,

数组中最多能存储元素个数: 21 亿多

数组中每一位能表示的数字个数: 42 亿多

因此, BigInteger 能表示的最大数字为: 42 亿的 21 亿次方

实际中绝大部分电脑都没有这么大的内存, 因此可以认为 BigInteger 类型的数字是无穷大的.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/833703.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cuda 驱动安装

Cuda 驱动的安装方法。Author: ACatSmiling Since: 2024-11-13CUDA(Compute Unified Device Architecture):是 NVIDIA 推出的一种并行计算平台和编程模型,它允许开发者利用 NVIDIA GPU(图形处理器)的强大计算能力进行通用计算,而不仅仅局限于图形处理。简单来说,CUDA 提…

[RoarCTF 2019]Easy Java 1

[RoarCTF 2019]Easy Java 1 打开实例发现登录框,尝试万能密码admin or 1=1#后无果注意到登录框下有个help,点击发现文件读取显示文件notfound,文件未找到,怀疑是请求方法问题,尝试POST请求发现能成功下载,确定这道题为任意文件下载 打开help.docx,显示看来文件不在这里,…

【linux日志】web日志分析

WEB正确日志格式分析#日志统计举例[root@master ~]# cat /etc/httpd/logs/access_log |awk {print $1}#对IP排序[root@master ~]# cat /etc/httpd/logs/access_log |awk {print $1}|sort#打印每一个重复出现IP的次数,[root@master ~]# cat /etc/httpd/logs/access_log |awk {p…

SpringBoot配置多数据源实战

SpringBoot配置多数据源实战@目录SpringBoot配置多数据源实战需求来源:简单粗暴3步使用步骤:思路讲解:目录结构:使用注意点: SpringBoot配置多数据源实战 需求来源: 当相关业务场景想实现同时操作2个甚至多个不同数据库表的时候,就需要配置多个数据源。简单粗暴3步使用步…

HTTP 协议学习笔记

HTTP 协议学习笔记 带新手走进神秘的HTTP协议 - 超超boy - 博客园 HTTP 首部字段详细介绍 - 超超boy - 博客园 《白帽子讲 web 安全(第二版)》HTTP 默认的端口号为 80,HTTPS 的端口号为 443。HTTP 是无状态协议,它不对之前发生过的请求和响应的状态进行管理。 可以使用 Coo…

自主研发RPA,基于uiautomatorviewer的自动化代码生成器,一键生成Java代码和Cucumber描述文件

介绍 基于UI Automator进行二次开发,让你不懂开发也能编写自动化测试代码, 一边生成代码一边Debug,毫不费力写出完美的自动化测试代码 。该工具集成了Tomcat使得添加新的功能的时候使用HTML+API进行开发,降低了开发难度;集成了Derby数据库,测试用例持久化到数据库。 软件…

关于NVIDIA Jetson AGX Xavier刷机过程记录

刷机记录,再刷机忘记了回来看看~主机电脑安装ubuntu20.04虚拟机,NVIDIA sdkmanager,主机端连上路由器提供的wifi。再将Jetson接上电源,但不开机。拿出附带的typec——USB数据线,typec端连上图中的typec口,USB连上主机电脑。找出一根网线,一端连接Jetson,另一端连接步骤…

shell编程 - 基础篇

1. Shell简介Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。2. Shell编程语言必知必会shell命令解释器:bash编程常用命令解释器.命令解释器bash 目前应用最广泛一…

第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision

第四届光学与机器视觉国际学术会议(ICOMV 2025)2025 4th International Conference on Optics and Machine Vision重要信息官网:https://ais.cn/u/vEbMBz

【os】操作系统是怎样一步步接收键盘按键的?

你有没有想过,按下键盘按键后,相应的字符是怎么一步步显示在屏幕上的? 首先来看硬件部分,你至少应该能想到必须得有键盘和CPU:之后呢,cpu是怎么知道有键盘按下呢? 为了让键盘按下按键后能通知到CPU,需要借助键盘控制器,keyboard controller,这当然也是硬件:当按下按…

Kafka学习day01

Kafka的学习day01-Kafka基础环境的搭建Kafka Centos7环境搭建 1. 安装Zookeeper 1.1 官网下载安装包ZooKeeper官网下载地址1.2 使用Xftp或远程工具将ZooKeeper安装包上传文件到服务器或虚拟机1.3 编写配置文件 进入ZooKeeper安装目录 cd {安装目录}/conf/1.3.1 配置文件模版 # …

从数据到知识,知识中台赋能企业智能化升级

在信息爆炸的时代,企业面临着数据泛滥与知识匮乏的双重挑战。如何将海量的数据转化为有价值的知识,进而驱动企业的智能化升级,已成为企业竞争力的关键。知识中台作为企业数字化转型的核心,正逐渐成为企业智能化升级的新引擎。 一、数据与知识的转化 数据本身并不等同于知识…