原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性。

我们都知道 Integer 是 Int 的包装类,int 的最大值为 2^31-1。若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类。

BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。

下面,让我们一起来学习一下BigInteger的常用方法:

正文:

读入方法

nextBigInteger():控制台读入一个BigInteger型数据,类似于int型的nextInt();

 //读入方法:nextBigInteger()@Testpublic void test5() {Scanner scan = new Scanner(System.in);                // 读入int n = scan.nextInt();                           // 读入一个int;BigInteger m = scan.nextBigInteger();               // 读入一个BigInteger;while(scan.hasNext()){    System.out.print("scan.hasNext()=" + scan.hasNext());}}
构造方法

默认为十进制,也是我们最常用的,同时也支持自定义进制类型(已存在的);

 //进制转换@Testpublic void testScale() {//在构造将函数时,把radix进制的字符串转化为BigIntegerString str = "1011100111";int radix = 2;BigInteger interNum1 = new BigInteger(str,radix);   //743//我们通常不写,则是默认成10进制转换,如下:BigInteger interNum2 = new BigInteger(str);          //1011100111}
基本运算

返回值为BigInteger类型:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate();

 //基本运算:add(),subtract(),multiply(),divide(),mod(),remainder(),pow(),abs(),negate()@Testpublic void testBasic() {BigInteger a = new BigInteger("13");BigInteger b = new BigInteger("4");int n = 3;//1.加BigInteger bigNum1 = a.add(b);           //17//2.减BigInteger bigNum2 = a.subtract(b);       //9//3.乘BigInteger bigNum3 = a.multiply(b);        //52//4.除BigInteger bigNum4 = a.divide(b);     //3//5.取模(需 b > 0,否则出现异常:ArithmeticException("BigInteger: modulus not positive"))BigInteger bigNum5 = a.mod(b);         //1//6.求余BigInteger bigNum6 = a.remainder(b);  //1//7.平方(需 n >= 0,否则出现异常:ArithmeticException("Negative exponent"))BigInteger bigNum7 = a.pow(n);          //2197//8.取绝对值BigInteger bigNum8 = a.abs();            //13//9.取相反数BigInteger bigNum9 = a.negate();       //-13}
比较大小

compareTo()返回一个int型数据:1 大于; 0 等于; -1 小于;
max(),min():分别返回大的(小的)那个BigInteger数据;

 //比较大小:compareTo(),max(),min()@Testpublic 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}
常量

ZERO,ONE,TEN 返回值为BigInteger类型:有朋友提到的-1,2,源码注释里面已表明不再输出(Not exported.);

 //常量(返回BigInteger类型)//有朋友提到的-1和2,源码注释里面已表明不再输出(Not exported.)@Testpublic void testFinalNum() {//0BigInteger zero = BigInteger.ZERO;//1BigInteger one = BigInteger.ONE;//10BigInteger ten = BigInteger.TEN;}
类型转换

将BigInteger数据转换成基本数据类型,还可以转换成radix进制的字符串形式;

 //类型转换(返回类型如下)@Testpublic void testToAnother() {BigInteger bigNum = new BigInteger("52");int radix = 2;//1.转换为bigNum的二进制补码形式byte[] num1 = bigNum.toByteArray();//2.转换为bigNum的十进制字符串形式String num2 = bigNum.toString();        //52//3.转换为bigNum的radix进制字符串形式String num3 = bigNum.toString(radix);    //110100//4.将bigNum转换为intint num4 = bigNum.intValue();//5.将bigNum转换为longlong num5 = bigNum.longValue();//6.将bigNum转换为floatfloat num6 = bigNum.floatValue();//7.将bigNum转换为doubledouble num7 = bigNum.doubleValue();}
二进制运算

返回值为BigInteger类型,此类方法不常用,有备无患;

 //二进制运算(返回类型都为BigInteger,不常用,但有备无患)@Testpublic void testBinaryOperation() {BigInteger a = new BigInteger("13");BigInteger b = new BigInteger("2");int n = 1;//1.与:a&bBigInteger bigNum1 = a.and(b);           //0//2.或:a|bBigInteger bigNum2 = a.or(b);           //15//3.异或:a^bBigInteger bigNum3 = a.xor(b);            //15//4.取反:~aBigInteger bigNum4 = a.not();          //-14//5.左移n位: (a << n)BigInteger bigNum5 = a.shiftLeft(n);   //26//6.右移n位: (a >> n)BigInteger bigNum6 = a.shiftRight(n);   //6}
权限控制

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

 //权限控制:setBit(),testBit()@Testpublic 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);      //trueboolean flag2 = numBig.testBit(5);       //trueboolean flag3 = numBig.testBit(13);      //trueboolean flag4 = numBig.testBit(66);      //trueboolean 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;}

小结

  1. BigInteger也是不可变的,在进行每一步运算时,都会产生一个新的对象。都会产生一个新的对象。发生异常算术条件时,会抛出ArithmeticException异常。例如,一个整数除以“0”,会抛出一个这个类的实例;
  2. 假设计算一个int数据平方与另一个大小的问题,很可能会内存溢出。除了使用二分法外,利用BigInteger的compareTo方法也是一个好选择,简单易懂,而且不需要算法支持;
  3. 本章作为笔记使用,内容比较全面,但常用的只有:构造函数,基本运算以及compareTo(),intValue(),setBit(),testBit()方法;
  4. setBit()和testBit()方法可用于菜单的权限控制,小编在开发中多次尝试,非常好用。很多微博有相关介绍,在这里我不做项目演示了。

我是IT无知君,您的点赞、评论和关注,是我继续创作的不懈动力。
学无止境,气有浩然,让我们一起加油,乘风破浪,江湖有缘再见!!

Java中BigInteger类的使用方法详解,常用最全系列!相关推荐

  1. Java中BigDecimal类的使用方法详解,常用最全系列!

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.对于Double类型的运算,通常使用此类处理,来有效避免精度问题. 下面,我们从五个功能点 ...

  2. Python的Django框架中forms表单类的使用方法详解2

    用户表单是Web端的一项基本功能,大而全的Django框架中自然带有现成的基础form对象,本文就Python的Django框架中forms表单类的使用方法详解. Form表单的功能 自动生成HTML ...

  3. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

  4. Java 中Date类getTime()的方法

    Java 中Date类getTime()的方法 1.getTime() /**Returns the number of milliseconds since January 1, 1970, 00: ...

  5. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  6. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  7. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  8. java读写json格式的文件方法详解.txt,并批量存储进redis

    捐躯赴国难,视死忽如归.恸哭六军俱缟素,冲冠一怒为红颜.君子坦荡荡,小人长戚戚.风日晴和人意好,夕阳箫鼓几船归.民为贵,社稷次之,君为轻.Java 读写json格式的文件方法详解 文章录入:7747. ...

  9. java中List的用法和实例详解

    Java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提 ...

最新文章

  1. 32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?
  2. 微信小程序封装的Promise工具类 ES6语法
  3. 分割线不显示_90后都30岁了,为什么还不结婚
  4. linux shell if -a 到-z参数含义
  5. 新手上路必学的Python函数基础知识,全在这里了(多段代码举例)
  6. matlab chirp函数模糊函数,8个OFDM-Chirp波形的时频域图及自(互)模糊函数图
  7. SAP License:如何获取采购订单一次性供应商的地址信息
  8. 【Tomcat】Tomcat下设置项目为默认项目
  9. mongodb的数据怎么导入到hdfs上_如何成为一名合格的数据架构师?
  10. kong 自建一个具有健康检查功能的http/tcp负载均衡器,配置流量权重,自动/手动目标健康,流量统一认证、鉴权、限流限速、修正,监控、日志等功能
  11. oneno浏览器插件_Send to OneNote 1.2.13
  12. Hadoop核心组件及组件介绍
  13. 三国鼎立企查查、天眼查、微猫的三国大战
  14. 微信支付v3 AEAD_AES_256_GCM解密JS版本代码及验证 javascript
  15. chrome插件-图片放大预览-imagus
  16. pandas计算店家的每日营业额示例
  17. sub eax, _PAGESIZE; decrease by PAGESIZE test dword ptr [eax],eax ; probe page
  18. 像素画软件android,Pixly像素画编辑器
  19. solidworks打开大型装配体特别卡。跑不满内存、CPU、GPU。
  20. 向工程腐化开炮 | 治理思路全解

热门文章

  1. 扼腕:东芝宣布放弃HD-DVD格式
  2. QQ小程序插屏广告怎么写
  3. 移动硬盘启动的PE系统的制作教程
  4. 基于JAVA河池市旅游信息系统计算机毕业设计源码+数据库+lw文档+系统+部署
  5. 基于用户的协同过滤算法(UserCF)
  6. Spring Cloud组件之GetWay
  7. chrome浏览器启动时候的默认网页设置不生效怎么解决
  8. C++_OpenCV不通过SDK打开摄像头
  9. beforeEach
  10. 当我不再依赖你的时候说说_「精选」关于依赖一个人的说说()-说说控