Số nguyên cực lớn với BigInteger

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 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 longint 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.

3.6 5 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x