概述
在Java中,由CPU原生提供的整型最大范围是64位1ong型整数。使用1ong型整数可以直接通过CPU指令进行计算,速度非常快。如果我们使用的整数范围超过了long型怎么办?这个时候,就只能用数据结构来模拟一个大整数。BigInteger 内部用一个 int[]数组来模拟一个非常大的整数:java.math.BigInteger 就是用来表示任意大小的整数。
构造器
BigInteger(String val)
构造一个 BigInteger,其值为给定的字符串 val。字符串应表示一个合法的整数值(包括正负号)。
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("123");
System.out.println(bigInteger); //123
}
BigInteger(String val, int radix)
构造一个 BigInteger,其值为给定的字符串 val,并按照指定的进制 radix 解析字符串。进制范围是 2 到 36。
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("1011", 2); // 二进制字符串 "1011" 转换为十进制 BigInteger
System.out.println(bigInteger); //11
}
BigInteger(int numBits)
构造一个 BigInteger,其值为一个大于或等于 0 的随机整数,该整数具有 numBits 位的二进制表示。
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger(128, new SecureRandom());
System.out.println(bigInteger); //12560529483309409158830312075381906932
}
BigInteger(int signum, byte[] magnitude)
构造一个 BigInteger,其值由给定的字节数组 magnitude 表示,并使用 signum 指定符号。
signum 为 1 表示正数,-1 表示负数,0 表示零。
magnitude 是表示数值的字节数组(不包括符号位)。
public static void main(String[] args) {
byte[] magnitude = new byte[] {1,2,3};
BigInteger bigInteger = new BigInteger(1, magnitude); // 正数
System.out.println(bigInteger); //66051
}
BigInteger(byte[] bytes)
构造一个 BigInteger,其值由给定的字节数组 bytes 表示(字节数组的第一个字节表示最高有效位)。
public static void main(String[] args) {
byte[] bytes = new byte[] {1,2,3};
BigInteger bigInteger = new BigInteger(bytes);
System.out.println(bigInteger); //66051
}
常用方法
BigInteger abs()
返回此 BigInteger 的绝对值的 BigInteger
BigInteger bigInteger = new BigInteger("-123");
BigInteger abs = bigInteger.abs();
System.out.println(abs); //123
add(BigInteger val)
返回其值为 (this + val) 的 BigInteger
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("-123");
BigInteger bigInteger2 = new BigInteger("129");
BigInteger bigInteger3 = bigInteger1.add(bigInteger2);
System.out.println(bigInteger3); //6
}
subtract(BigInteger val)
返回其值为 (this - val) 的 BigInteger
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("-123");
BigInteger bigInteger2 = new BigInteger("129");
BigInteger bigInteger3 = bigInteger2.subtract(bigInteger1);
System.out.println(bigInteger3); //252
}
multiply(BigInteger val)
返回其值为 (this * val) 的 BigInteger
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("-123");
BigInteger bigInteger2 = new BigInteger("129");
BigInteger bigInteger3 = bigInteger2.multiply(bigInteger1);
System.out.println(bigInteger3); //-15867
}
divide(BigInteger val)
返回其值为 (this / val) 的BigInteger,整数相除只保留整数部分
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("-123");
BigInteger bigInteger2 = new BigInteger("1290");
BigInteger bigInteger3 = bigInteger2.divide(bigInteger1);
System.out.println(bigInteger3); //-10
}
remainder(BigInteger val)
返回其值为 (this % val) 的 BigInteger
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("123");
BigInteger bigInteger2 = new BigInteger("1290");
BigInteger bigInteger3 = bigInteger2.remainder(bigInteger1);
System.out.println(bigInteger3); //60
}
divideAndRemainder(BigInteger val)
返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("123");
BigInteger bigInteger2 = new BigInteger("1290");
BigInteger[] bigIntegers = bigInteger2.divideAndRemainder(bigInteger1);
for(int i = 0;i<bigIntegers.length;i++){
System.out.print(bigIntegers[i]); //1060
}
// 1290/123 = 10 1290%123= 60
}
pow(int exponent)
返回其值为this的 的exponent次方的 BigInteger
public static void main(String[] args) {
BigInteger bigInteger = new BigInteger("123");
BigInteger pow = bigInteger.pow(2);
System.out.println(pow); //123的2次方 = 15129
}