文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中BigInteger用法小结

2023-03-07 17:28

关注

在java中经常会遇到比较大的数,甚至超过了long型,那么该如何处理这些“大数据”呢?在java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,从原则上是可以表示“天文单位”一样大的数字咯,但有一个缺点就是比较费内存!

在这里,我们详细描述下BigInteger的用法,在使用之前,我们需要导入java.math.*包

一.介绍BigInteger经常使用到的一些函数

value.Of(参数); 这个函数的作用是将括号内的参数转换成指定的数据类型,例如以下例子

                      int A=42;
                     BigInteger f=BigInteger.valueOf(A);
                      System.out.println("f="+f); //输出的f将会等于BigInteger型的42
                       // 答案: f=42

其实还可以转成其他的类型,例如以下以下,※※※需要注意的是不重写的话,jdk1.8 版本是无法支持这种转换的※※※

                       String s="12345";
                      BigInteger c=BigInteger.valueOf(s);
        //  则c=12345;※※※需要注意的是不重写的话,jdk1.8 版本是无法支持这种转换的

add()方法; 这个函数的作用是将大整数加起来,例如以下例子

                       BigInteger c=new BigInteger("6");
                       BigInteger d=new BigInteger("3");
                      System.out.println("c+d="+c.add(d));
                        //答案输出: c+d=9

③subtract()方法,这个函数的作用是将大整数相减,例如以下例子,运用时前者减后者

                       BigInteger c=new BigInteger("5");
                     BigInteger d=new BigInteger("3");
                      System.out.println("d-c="+d.subtract(c));
                        //答案输出: d-c=-2

④multiply()方法,这个函数的作用是将大整数相乘,例如以下例子,

                      BigInteger c=new BigInteger("6");
                     BigInteger d=new BigInteger("3");
                    System.out.println("c*d="+c.multiply(d));
                        //答案输出: c*d=18

⑤divide()方法,这个函数的作用是将大整数做除法,例如以下例子,

                       BigInteger c=new BigInteger("6");
                      BigInteger d=new BigInteger("4");
                     System.out.println("c/d="+c.divide(d));
                        // 答案输出;c/d=1

⑥remainder()方法,这个函数的作用是将大整数取余

⑦pow(exponent)方法,这个函数的作用是将大整数取exponent的指数,例如a.pow(b)==a^b;

⑧gcd()方法,这个函数的作用是将两个大整数取最大公约数,例如a.gcd(b);

⑨abs()方法,这个函数的作用是取绝对值,例如

                      BigInteger c=new BigInteger("-9");
                      System.out.println(c.abs());
                        //答案输出: 9

⑩negate()方法,这个函数的作用是取数的相反数,例如

                      BigInteger c=new BigInteger("9");
                     System.out.println(c.negate());
                        // 答案输出: -9

mod()方法; 这个函数的作用是对数进行取余 a.mod(b)=a%b=a.remainder(b);

⑫max()方法,min()方法,分别是比较两个数的大小,例如a.max(b); 取a,b中的最大值

⑬compareTo()方法这个方法是用来比较两个大整数大小的

 public void testCompare() {
   BigInteger bigNum1 = new BigInteger("52");
   BigInteger bigNum2 = new BigInteger("27");
​
   //1.compareTo():返回一个int型数据(1 大于; 0 等于; -1 小于)
   int num = bigNum1.compareTo(bigNum2);           //1
​
   //2.max():直接返回大的那个数,类型为BigInteger
   //  原理:return (compareTo(val) > 0 ? this : val);
   BigInteger compareMax = bigNum1.max(bigNum2);   //52
​
   //3.min():直接返回小的那个数,类型为BigInteger
   //  原理:return (compareTo(val) < 0 ? this : val);
   BigInteger compareMin = bigNum1.min(bigNum2);   //27
}

⑭equals()方法,判断两个大整数是否相等,例如c.equals(d) 相等就返回 true;

二、介绍BigInteger的读入方法——nextBigInteger(),从控制台读入一个BigInteger型数据,类似于读入int型的nextInt();

public void test() {
    Scanner s = new Scanner(System.in);             // 读入
    int n = sc.nextInt();                           // 读入一个int;
    BigInteger m = sc.nextBigInteger();             // 读入一个BigInteger;
    while(sc.hasNext()){    
        System.out.print("sc.hasNext()=" + sc.hasNext());
    }
}

三、介绍BigInteger的构造方法

默认的是十进制,也就是我们平常较为常见的,例如

      BigInteger d=new BigInteger("48");
      System.out.println(d);  //答案输出:48,这里默认的是十进制,但也支持自定义转换类型

支持自定义进制类型(已存在的),例如二进制,四进制,八进制,十六进制,如下:

public void test() {
   //在构造将函数时,把radix进制的字符串转化为BigInteger
   String str = "1011100111";
   int radix = 2;  // radix代表二进制,为下一行代码中的参数radix赋值
   BigInteger interNum1 = new BigInteger(str,radix);   //743
}

四、介绍BigInteger的几个内部定义的常量——BigInteger.ZERO,BigInteger.ONE,BigInteger.TEN

//之前是支持-1和2,但现在表明已不再输出(Not exported.)
public void test() {
    //0
    BigInteger zero = BigInteger.ZERO;
    //1
    BigInteger one = BigInteger.ONE;
    //10
    BigInteger ten = BigInteger.TEN;
}

五、介绍BigInteger一些基本类型的转换

public void testToAnother() {
    BigInteger bigNum = new BigInteger("38");
    int radix = 2;
    
    //1.转换为bigNum的二进制补码形式
    byte[] num1 = bigNum.toByteArray();
    //2.转换为bigNum的十进制字符串形式
    String num2 = bigNum.toString();        //38
    //3.转换为bigNum的radix进制字符串形式
    String num3 = bigNum.toString(radix);   //100110
    //4.将bigNum转换为int
    int num4 = bigNum.intValue();
    //5.将bigNum转换为long
    long num5 = bigNum.longValue();
    //6.将bigNum转换为float
    float num6 = bigNum.floatValue();
    //7.将bigNum转换为double
    double num7 = bigNum.doubleValue();
}

六、权限控制

setBit(),testBit():可用于菜单的权限控制,非常好用,原理如下:

//权限控制:setBit(),testBit()
@Test
public void testSetAndTest() {
    //1.封装数据(setBit的值需 >= 0,否则出现异常:ArithmeticException("Negative bit address"))
    BigInteger permission = new BigInteger("0");
    BigInteger numBig = permission.setBit(2);
    numBig = numBig.setBit(5);
    numBig = numBig.setBit(13);
    numBig = numBig.setBit(66);
    System.out.println("原理:" + numBig); 
    // 原理:73786976294838214692 = 2^2+2^5+2^13+2^66 次方的和;
    // 看!!即使这么大的数也不会溢出,而int最大值只有2147483647;
​
    //2.取值验证(返回Boolean型)
    boolean flag1 = numBig.testBit(2);      //true
    boolean flag2 = numBig.testBit(5);      //true
    boolean flag3 = numBig.testBit(13);     //true
    boolean flag4 = numBig.testBit(66);     //true
    boolean flag5 = numBig.testBit(27);     //false
}

setBit():将set进去变量作为二进制数,计算它们的和,并以十进制显示; testBit():与setBit()相反,验证this的二进制组成元素中是否包含传入的变量;

//权限控制源码分析:
 
//1.setBit()原理:计算this与2的n次方的和
public BigInteger setBit(int n) {
	if (n < 0)
		throw new ArithmeticException("Negative bit address");
 
	int intNum = n >>> 5;
	int[] result = new int[Math.max(intLength(), intNum+2)];
 
	for (int i=0; i < result.length; i++)
		result[result.length-i-1] = getInt(i);
 
	result[result.length-intNum-1] |= (1 << (n & 31));
 
	return valueOf(result);
}
 
//2.testBit()原理:计算this的值中是否包含2的n次方
public boolean testBit(int n) {
	if (n < 0)
		throw new ArithmeticException("Negative bit address");
 
	return (getInt(n >>> 5) & (1 << (n & 31))) != 0;
}

到此这篇关于Java中BigInteger用法的详解的文章就介绍到这了,更多相关java中BigInteger用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯