前言
在Java中,由于没有long long类型。如果需要使用比long类型更大的整数数据时,就可以使用BigInteger类,它支持任意精度的整数。
创建BigInteger类型数据
@Test
public void test1() {Scanner scan = new Scanner(System.in);//1.控制台读入BigInteger n1 = scan.nextBigInteger();//2.将BigInteger的十进制字符串表示形式转化为BigIntegerBigInteger n2 = new BigInteger("123");//3.将radix进制的字符串转化为十进制的BigIntegerString str = "1010011010";int radix = 2;BigInteger n3 = new BigInteger(str, radix);//666//如果直接写成如下,就会直接将1010011010看成十进制整数BigInteger n3 = new BigInteger(str);//1010011010
}
基本运算
@Test
public void test2() {BigInteger x = new BigInteger("24");BigInteger y = new BigInteger("12");int val = 5;//1.加BigInteger n1 = x.add(y);//2.减BigInteger n2 = x.subtract(y);//3.乘BigInteger n3 = x.multiply(y);//4.除BigInteger n4 = x.divide(y);//5.取模(y不能为负数)BigInteger n5 = x.mod(y);//6.求余BigInteger n6 = x.remainder(y);//7.平方(val不能为负数)BigInteger n7 = x.pow(val);//8.取绝对值BigInteger n8 = x.abs();//9.取相反数BigInteger n9 = x.negate();
}
类型转换
@Test
public void test3() {int val1 = 123;long val2 = 456;//1.int转换为BigInteger类型BigInteger n1 = new BigInteger(val1 + "");//2.long转换为BigInteger类型BigInteger n2 = new BigInteger(val2 + "");//3.BigInteger转int//method 1://PS:此方法如果此 BigInteger 的值超出 int 类型的范围,则会引发 ArithmeticException。int i1 = n1.intValueExact();//method 2://PS:如果这个 BigInteger 太大而无法放入 int 中,则只返回低阶 32 位。请注意,此转换可能会丢失有关 BigInteger 值的总体大小的信息,并返回带有相反符号的结果。int i2 = n1.intValue();//4.BigInteger转long//method 1://PS:此方法如果此 BigInteger 的值超出 long 类型的范围,则会引发 ArithmeticException。long l1 = n1.longValueExact();//method 2://PS:如果这个 BigInteger 太大而无法放入 long 中,则只返回低阶 64 位。请注意,此转换可能会丢失有关 BigInteger 值的总体大小的信息,并返回带有相反符号的结果。long l2 = n1.longValue();
}
比较大小
@Test
public void test4() {BigInteger b1 = new BigInteger("123");BigInteger b2 = new BigInteger("456");//1.compareTo():大于返回1,等于返回0,小于返回-1int n1 = b1.compareTo(b2);//2.max():返回值:BigInteger,其值为 b1 和 b2 中的较大值。如果它们相等,则可以返回任何一个。BigInteger bMax = b1.max(b2);//3.min():返回值:BigInteger,其值为 b1 和 b2 中的较小值。如果它们相等,则可以返回任何一个。BigInteger bMin = b1.min(b2);
}
常量值
PS:源码注释里面 -1 的访问权限已被修改为了private
@Test
public void test5() {
BigInteger zero = BigInteger.ZERO;//0BigInteger one = BigInteger.ONE;//1BigInteger two = BigInteger.TWO;//2BigInteger ten = BigInteger.TEN;//10
}
位运算
@Test
public void test6() {BigInteger b1 = new BigInteger("123");BigInteger b2 = new BigInteger("456");//按位与BigInteger bAnd = b1.and(b2);//按位或BigInteger bOr = b1.or(b2);//按位异或BigInteger bXor = b1.xor(b2);//按位取反BigInteger bNot = b1.not();//左移2位BigInteger bShiftLeft = b1.shiftLeft(2);//右移2位BigInteger bShiftRight = b1.shiftRight(2);
}