首页 > 编程语言 >Java零基础入门-大数

Java零基础入门-大数

时间:2023-11-26 18:02:10浏览次数:34  
标签:BigInteger Java 入门 val 大数 System println bi2 bi1

前言

在日常开发中,常常会涉及到处理大数字的需求,如大整数运算、加密算法等。Java作为一门面向对象的编程语言,其内置类库中提供了BigInteger和BigDecimal类,可以方便地进行大数字的运算和处理。本文将介绍Java中BigInteger类的使用,帮助零基础的读者快速学习大数字的处理。

摘要

本文主要介绍了Java中BigInteger类的使用,包括创建、运算、比较等操作。同时,通过一个RSA加密算法的应用实例,展示了BigInteger类的实际应用场景。最后对BigInteger类进行了优缺点分析,以及给出了测试用例和代码示例,帮助读者更好地理解和掌握BigInteger类的使用。

简介

BigInteger类是Java内置的用于处理大整数的类,其可以表示任意大小的整数,而不受Java中基本数据类型的范围限制。同时,BigInteger类也提供了丰富的方法用于实现加减乘除、取模、幂运算、比较大小等操作。在实际开发中,BigInteger类常用于加密算法、数字签名等场景。

源代码解析

创建BigInteger对象

在Java中,可以使用new关键字创建一个BigInteger对象,其构造方法如下:

BigInteger(String val)

其中,val表示需要转换为大数的字符串。例如:

BigInteger bi = new BigInteger("12345678901234567890");

上述代码表示创建了一个BigInteger对象,其值为12345678901234567890。

除此之外,BigInteger对象的创建还可以使用如下方法:

BigInteger bi1 = BigInteger.valueOf(long val);
BigInteger bi2 = new BigInteger(int bitLength, Random rnd);

其中,valueOf方法可以将long类型的数字转换为BigInteger对象,bitLength参数表示BigInteger对象的二进制补码位数,rnd参数表示用于生成随机BigInteger对象的随机数生成器。这里不再赘述。

运算操作

BigInteger类提供了丰富的运算方法,包括加减乘除、取模、幂运算、比较大小等操作。这些方法的使用与普通的数值类型基本相同。

BigInteger add(BigInteger val)    //加
BigInteger subtract(BigInteger val)   //减
BigInteger multiply(BigInteger val)   //乘
BigInteger divide(BigInteger val)     //除
BigInteger mod(BigInteger val)    //取模
BigInteger pow(int exponent)   //幂运算
int compareTo(BigInteger val)  //比较大小

例如:

BigInteger bi1 = new BigInteger("12345678900000000000");
BigInteger bi2 = new BigInteger("98765432100000000000");

BigInteger bi3 = bi1.add(bi2);  //bi3的值为111111111000000000000

比较操作

BigInteger类的比较操作主要使用compareTo方法,该方法的返回值有三种情况:

  • 返回负整数:表示当前BigInteger对象小于传入的参数
  • 返回零:表示当前BigInteger对象等于传入的参数
  • 返回正整数:表示当前BigInteger对象大于传入的参数

例如:

BigInteger bi1 = new BigInteger("123456789");
BigInteger bi2 = new BigInteger("987654321");

System.out.println(bi1.compareTo(bi2));   //-1
System.out.println(bi2.compareTo(bi1));   //1
System.out.println(bi1.compareTo(new BigInteger("123456789")));  //0

其他操作

除了以上运算和比较操作,BigInteger类还提供了其他一些方法,如位运算、取反、与或非等操作。

BigInteger and(BigInteger val)  //与
BigInteger or(BigInteger val)   //或
BigInteger xor(BigInteger val)  //异或
BigInteger not()    //取反
BigInteger shiftLeft(int n)     //左移n位,相当于乘以2^n
BigInteger shiftRight(int n)    //右移n位,相当于除以2^n
int bitCount()  //返回BigInteger对象表示的二进制补码中1的个数

应用场景案例

RSA加密算法是一种常用的加密算法,在其实现中需要用到BigInteger类。具体实现方法可以参考以下代码:

import java.math.BigInteger;
import java.security.SecureRandom;

public class RSA {
    
    private final static BigInteger one = new BigInteger("1");
    private final static SecureRandom random = new SecureRandom();

    private BigInteger privateKey;
    private BigInteger publicKey;
    private BigInteger modulus;

    public RSA(int bitLength) {
        BigInteger p = BigInteger.probablePrime(bitLength / 2, random);
        BigInteger q = BigInteger.probablePrime(bitLength / 2, random);
        BigInteger phi = (p.subtract(one)).multiply(q.subtract(one));
        modulus = p.multiply(q);
        publicKey = new BigInteger("65537");  //公钥为固定值,通常为65537
        privateKey = publicKey.modInverse(phi);
    }

    public byte[] encrypt(byte[] message) {
        return (new BigInteger(message)).modPow(publicKey, modulus).toByteArray();
    }

    public byte[] decrypt(byte[] message) {
        return (new BigInteger(message)).modPow(privateKey, modulus).toByteArray();
    }
}

在上述代码中,使用BigInteger类实现了RSA算法中的加密和解密操作。具体实现原理可以参考RSA算法的相关知识。

优缺点分析

优点

  1. 可以表示任意范围的整数,不受整型和长整型数据类型的范围限制。
  2. 提供了丰富的运算和比较操作,方便进行大数字的处理。
  3. 在加密算法、数字签名等场景中有广泛应用。

缺点

  1. 由于BigInteger对象占用内存较大,因此在处理大量数据时可能会影响性能。
  2. 在进行大数字运算时需要较长的时间进行计算,可能会引起阻塞操作。

类代码方法介绍

构造方法

BigInteger(String val)   //根据字符串val创建BigInteger对象
BigInteger(long val)    //根据long类型的val创建BigInteger对象
BigInteger(int signum, byte[] magnitude)    //使用指定的大小和符号创建BigInteger对象

运算方法

BigInteger add(BigInteger val)    //加
BigInteger subtract(BigInteger val)   //减
BigInteger multiply(BigInteger val)   //乘
BigInteger divide(BigInteger val)     //除
BigInteger mod(BigInteger val)    //取模
BigInteger pow(int exponent)   //幂运算
int compareTo(BigInteger val)  //比较大小

比较方法

boolean equals(Object obj)     //判断当前BigInteger对象是否等于指定对象
int compareTo(BigInteger val)  //比较大小

其他方法

BigInteger and(BigInteger val)  //与
BigInteger or(BigInteger val)   //或
BigInteger xor(BigInteger val)  //异或
BigInteger not()    //取反
BigInteger shiftLeft(int n)     //左移n位,相当于乘以2^n
BigInteger shiftRight(int n)    //右移n位,相当于除以2^n
int bitCount()  //返回BigInteger对象表示的二进制补码中1的个数
String toString()   //将BigInteger对象转换为十进制字符串
byte[] toByteArray()   //将BigInteger对象转换为二进制补码数组

测试用例

测试代码

import java.math.BigInteger;

public class Test {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("12345678900000000000");
        BigInteger bi2 = new BigInteger("98765432100000000000");

        System.out.println("bi1 + bi2 = " + bi1.add(bi2));  //bi1 + bi2 = 111111111000000000000

        System.out.println("bi1 - bi2 = " + bi1.subtract(bi2)); //bi1 - bi2 = -86419753200000000000

        System.out.println("bi1 * bi2 = " + bi1.multiply(bi2)); //bi1 * bi2 = 1219326311371232876715272110000000000

        System.out.println("bi2 / bi1 = " + bi2.divide(bi1)); //bi2 / bi1 = 8

        System.out.println("bi2 % bi1 = " + bi2.mod(bi1)); //bi2 % bi1 = 839506172000000000

        System.out.println("bi1^3 = " + bi1.pow(3)); //bi1^3 = 18816763717869658727300850988427000000000000000000000000000000000000

        System.out.println("bi1 > bi2? " + (bi1.compareTo(bi2) > 0)); //bi1 > bi2? false

        System.out.println("bi1 & bi2 = " + bi1.and(bi2)); //bi1 & bi2 = 9629778901000000000

        System.out.println("bi1 | bi2 = " + bi1.or(bi2)); //bi1 | bi2 = 110337471810000000000

        System.out.println("bi1 XOR bi2 = " + bi1.xor(bi2)); //bi1 XOR bi2 = 110337471810000000000

        System.out.println("~bi1 = " + bi1.not()); //~bi1 = -12345678900000000001

        System.out.println("bi1 << 3 = " + bi1.shiftLeft(3)); //bi1 << 3 = 98765431280000000000000

        System.out.println("bi2 >> 5 = " + bi2.shiftRight(5)); //bi2 >> 5 = 3086411031250000000

        System.out.println("bi1 bit count = " + bi1.bitCount()); //bi1 bit count = 41

        System.out.println("bi2 bit count = " + bi2.bitCount()); //bi2 bit count = 47
    }
}

测试结果

bi1 + bi2 = 111111111000000000000
bi1 - bi2 = -86419753200000000000
bi1 * bi2 = 1219326311371232876715272110000000000
bi2 / bi1 = 8
bi2 % bi1 = 839506172000000000
bi1^3 = 18816763717869658727300850988427000000000000000000000000000000000000
bi1 > bi2? false
bi1 & bi2 = 9629778901000000000
bi1 | bi2 = 110337471810000000000
bi1 XOR bi2 = 110337471810000000000
~bi1 = -12345678900000000001
bi1 << 3 = 98765431280000000000000
bi2 >> 5 = 3086411031250000000
bi1 bit count = 41
bi2 bit count = 47

标签:BigInteger,Java,入门,val,大数,System,println,bi2,bi1
From: https://blog.51cto.com/u_15700799/8571304

相关文章

  • 通过Java和ECDSA生成X509版本的证书
    1.创新maven项目导入相关依赖<dependencies><dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.70</version></depe......
  • Java 系统学习 | windows 环境安装 java
    学习语言,首先搭建环境。当前最新是Java21,本篇安装17版本。一、下载进入官网OracleDevelopers开发语言选择JavaDownloads选择JDK选择windows环境的JDK17下载exe文件即可想要其它老版本选择archive二、安装配置双击下载的exe......
  • 斜率优化入门 任务分配
    终于开始斜率优化了。。洛谷P2365任务安排题目描述nn个任务排成一个序列在一台机器上等待完成(顺序不得改变),这nn个任务被分成若干批,每批包含相邻的若干任务。从零时刻开始,这些任务被分批加工,第ii个任务单独完成所需的时间为titi​。在每批任务开始前,机器需要启动时间s......
  • Flutter的动画开发入门简介
    Flutter动画库中的核心类,插入用于指导动画的值。Animation对象知道动画目前的状态(例如,是否开始,暂停,前进或倒退),但是对屏幕上显示的内容一无所知。AnimationController管理Animation。CurvedAnimation定义进程为非线性曲线。Tween为动画对象插入一个范围值。例如,Tween可......
  • JavaWeb实现文件的上传和下载
    文件的上传和下载,是非常常见的功能,很多系统,或者软件中经常使用文件的上传和下载.比如QQ头像/邮箱中的上传和下载功能/OA系统中审批中附件的上传.1.文件的上传步骤:有一个form标签,method=post请求form标签的encType属性的值必须为multipart/form-data值在form标签中,使......
  • 小白指针(七)--------新手入门
    我们之前讲了很多。但是指针的路还需要继续往下走,其实也快结束了,学习就是一种坚持的路,只有往前走才能学到更多,看到更多。(。・ω・。),今天的可能比前面的多,请耐心学习,谢谢在指针更新完之后我会将指针的内容,整理发一片这里是指针的快结束了,这里的一节结束还有最后有一片文章了,朋友们加油呀!一......
  • 大数定律
    LawofLargeNumbers,LLN我们在定义概率空间和随机变量时是从集合和函数出发的,而当我们想要真正理解概率的“意义”时,其实我们已经默认了大数定律这一事实。硬币正面朝上的概率为\(1/2\)这句话的意思是,当投掷硬币的次数充分大以至于是一个“大数”时,应当期待有接近一半的次数投......
  • C#入门实践
    ①必备知识点_控制台相关staticvoidMain(string[]args){Console.WriteLine("控制台相关");#region知识点一复习输入输出//输出//Console.WriteLine("123123");//光标空行//Console.Write("1......
  • Java中的事务——JDBC事务和JTA事务
    简介: 本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDBC事务、JTA(JavaTransactionAPI)事务、容器事务。本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDB......
  • JavaWeb(上)
    1.TomcatTomcat(全称为ApacheTomcat)是一个开源的JavaServlet容器,也是一个能够托管JavaWeb应用的Web服务器。Tomcat的主要功能是解析和执行JavaServlet、JavaServerPages(JSP)和相关的JavaEE技术。它可以作为一个独立的Web服务器运行,也可以与其他HTTP服务器(如ApacheHTTP服务......