Mục lục
BigInteger tương tự như kiểu dữ liệu nguyên thuỷ int, long nhưng cho phép lưu trữ giá trị kiểu số nguyên cực lớn, lớn hơn rất nhiều so với giá trị cực đại của int và long cho phép. Lưu ý một object BigInteger là immutable.
Ví dụ giao thừa của 50 là 30414093201713378043612608166064768844377641568960512000000000000, giá trị này quá lớn để kiểu long và int có thể biểu diễn đó là lý do java hỗ trợ thêm cho chúng ta BigInteger để lưu trữ các giá trị số nguyên cực lớn.
Khởi tạo BigInteger
Chúng ta có thể khởi tạo BigInteger từ chuỗi hoặc mảng byte
import java.math.BigInteger; class Main { public static void main(String args[]) { BigInteger biFromString = new BigInteger("1234567890987654321"); // 1234567890987654321 BigInteger biFromByteArray = new BigInteger( new byte[] { 64, 64, 64, 64, 64, 64 }); // 70644700037184 BigInteger biFromSignMagnitude = new BigInteger(-1, new byte[] { 64, 64, 64, 64, 64, 64 }); // -70644700037184 } }
Hoặc có thể convert long sang BigInteger bằng valueOf() method
BigInteger bi = BigInteger.valueOf(2305843009213693951L)
Các phép tính trên BigInteger
Cộng BigInteger – add()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("214145124124123112"); BigInteger res = bigInteger1.add(bigInteger2); System.out.println(res); // 1448713015111777433
Trừ BigInteger – subtract()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("214145124124123112"); BigInteger res = bigInteger1.subtract(bigInteger2); System.out.println(res); // 1020422766863531209
Nhân BigInteger – multiply
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("214145124124123112"); BigInteger res = bigInteger1.multiply(bigInteger2); System.out.println(res); // 264376694255208125644345211902766952
Chia BigInteger – divide()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("214145124124123112"); BigInteger res = bigInteger1.divide(bigInteger2); System.out.println(res); // 5
Các hàm toán học trong BigInteger
Trị tuyệt đối BigInteger – abs()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("-1234567890987654321"); BigInteger bigInteger1Abs = bigInteger1.abs(); // 1234567890987654321 BigInteger bigInteger2Abs = bigInteger2.abs(); // 1234567890987654321
Giá trị nhỏ nhất BigInteger – min()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("-1234567890987654321"); BigInteger min = bigInteger1.min(bigInteger2); // bigInteger2
Giá trị lớn nhất BigInteger – max()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("-1234567890987654321"); BigInteger min = bigInteger1.max(bigInteger2); // bigInteger1
Luỹ thừa BigInteger – pow()
BigInteger bigInteger = new BigInteger("1234567890987654321"); BigInteger pow = bigInteger.pow(2); // 1524157877457704723228166437789971041
Dấu BigInteger – signum()
BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("-1234567890987654321"); int sign1 = bigInteger1.signum(); // 1 int sign2 = bigInteger2.signum(); // -1
Toán tử Bit trong BigInteger
Giống như các kiểu số nguyên int, long. BigInteger cũng có các toán tử bit như and, or, xor, not, andNot, shiftLeft, shiftRight.
BigInteger i = new BigInteger("17"); BigInteger j = new BigInteger("7"); BigInteger and = i.and(j); // 1 BigInteger or = i.or(j); // 23 BigInteger not = j.not(); // -8 BigInteger xor = i.xor(j); // 22 BigInteger andNot = i.andNot(j); // 16 BigInteger shiftLeft = i.shiftLeft(1); // 34 BigInteger shiftRight = i.shiftRight(1); // 8
Ngoài ra chúng ta còn các method hỗ trợ thao tác với bit như bitCount, bitLength, getLowestSetBit, testBit, setBit, flipBit, clearBit.
BigInteger i = new BigInteger("1018"); int bitCount = i.bitCount(); // 8 int bitLength = i.bitLength(); // 10 int getLowestSetBit = i.getLowestSetBit(); // 1 boolean testBit3 = i.testBit(3); // true BigInteger setBit12 = i.setBit(12); // new BigInteger("5114") BigInteger flipBit0 = i.flipBit(0); // new BigInteger("1019") BigInteger clearBit3 = i.clearBit(3); // new BigInteger("1010")
So sánh BigInteger
Sử dụng compareTo() method để so sánh với một BigInteger khác, trả về -1 nếu bé hơn BigInteger được so sánh, 0 nếu bằng và 1 nếu lớn hơn.
import java.math.BigInteger; class Main { public static void main(String args[]) { BigInteger bigInteger1 = new BigInteger("1234567890987654321"); BigInteger bigInteger2 = new BigInteger("1234567890987654321"); BigInteger bigInteger3 = new BigInteger("5121241241254123"); System.out.println(bigInteger1.compareTo(bigInteger2)); // 0 System.out.println(bigInteger1.compareTo(bigInteger3)); // 1 System.out.println(bigInteger3.compareTo(bigInteger1)); //-1 } }
Tóm lược
BigInteger dùng để lưu trữ số nguyên cực lớn vượt ra khỏi giới hạn của int và long. BigInteger thường được dùng trong các ứng dụng mã hoá với sức mạnh lưu trữ của nó. Chúng ta cũng có thể dùng BigInteger để tín toán một vào phép tính có kết qủa lớn như là tính giai thừa etc.