정수는 값의 한계가 있다.
과학적 계산에서 더 큰값을 다뤄야할때 사용하는것이 BigInteger, 다만 성능은 long타입보다 떨어질 수 밖에 없다.
https://standout.tistory.com/22
https://standout.tistory.com/56
BigInteger는 다양한 방법을 사용하여 객체를 생성 할 수 있고
이는 주어진 상황과 사례에 따라 다르겠다.
//문자열에서 생성
String numberStr = "123456789012345678901234567890";
BigInteger bigInteger1 = new BigInteger(numberStr);
//정수에서 생성
long longValue = 1234567890123456789L;
BigInteger bigInteger3 = BigInteger.valueOf(longValue);
//BigInteger에서 생성
BigInteger originalBigInteger = new BigInteger("987654321");
BigInteger newBigInteger = new BigInteger(originalBigInteger.toByteArray());
//배열에서 생성
byte[] byteArray = {1, 2, 3, 4, 5};
BigInteger bigInteger4 = new BigInteger(byteArray);
BigInteger는 계산을 도와주는 메서드들이 정의되어있다.
BigInteger add( BigInteger val)
BigInteger subtract( BigInteger val)
BigInteger multiply( BigInteger val)
BigInteger divide( BigInteger val)
BigInteger remainder( BigInteger val)
import java.math.BigInteger;
public class BigIntegerExample {
public static void main(String[] args) {
// 생성된 BigInteger 객체들
BigInteger num1 = new BigInteger("123456789012345678901234567890");
BigInteger num2 = new BigInteger("987654321098765432109876543210");
// add() 메서드: 두 BigInteger 값을 더함
BigInteger sum = num1.add(num2);
System.out.println("Sum: " + sum);
//Sum: 1111111110111111110011111111000
// subtract() 메서드: 두 BigInteger 값을 뺌
BigInteger difference = num1.subtract(num2);
System.out.println("Difference: " + difference);
//Difference: -864197531086419753208641975320
// multiply() 메서드: 두 BigInteger 값을 곱함
BigInteger product = num1.multiply(num2);
System.out.println("Product: " + product);
//Product: 121932631112635269386129693570347534143581119683078270472199487193686200
// divide() 메서드: 두 BigInteger 값을 나눔
BigInteger quotient = num1.divide(num2);
System.out.println("Quotient: " + quotient);
//Quotient: 124
// remainder() 메서드: 두 BigInteger 값을 나눈 나머지를 계산
BigInteger remainder = num1.remainder(num2);
System.out.println("Remainder: " + remainder);
//Remainder: 123456789012345678901234567890
}
}
큰 숫자를 다루기 위한 클래스로 성능을 향상시키기위해 비트단위 메서드도 많이 가지고있다.
and, or, xor, not등은 물론이거니와 아래와같은 메서드도 제공한다.
int bitCount()
int bitLength()
boolean testbIt(int n)
BigInteger setBit (int n)
BigInteger clearBit(int n)
BigInteger flipBit(int n)
import java.math.BigInteger;
public class BigIntegerBitManipulationExample {
public static void main(String[] args) {
// 생성된 BigInteger 객체
BigInteger bigInteger = new BigInteger("123456789012345678901234567890");
// bitCount() 메서드: 2진수로 표현시, BigInteger의 비트 중 1의 개수를 반환
int countOfOnes = bigInteger.bitCount();
System.out.println("Count of Ones: " + countOfOnes);
//Count of Ones: 42
// bitLength() 메서드: 2진수로 표현시, BigInteger의 비트 길이를 반환
int bitLength = bigInteger.bitLength();
System.out.println("Bit Length: " + bitLength);
//Bit Length: 88
// testBit(int n) 메서드: 2진수로 표현시, 지정된 위치 n의 비트가 1인지 여부를 반환
boolean bitAtPosition5 = bigInteger.testBit(5);
System.out.println("Bit at Position 5: " + bitAtPosition5);
//Bit at Position 5: true
// setBit(int n) 메서드: 지정된 위치 n의 비트를 1로 설정
BigInteger setBitResult = bigInteger.setBit(3);
System.out.println("After Setting Bit at Position 3: " + setBitResult);
//After Setting Bit at Position 3: 123456789012345678901234567898
// clearBit(int n) 메서드: 지정된 위치 n의 비트를 0으로 설정
BigInteger clearBitResult = bigInteger.clearBit(2);
System.out.println("After Clearing Bit at Position 2: " + clearBitResult);
//After Clearing Bit at Position 2: 123456789012345678901234567886
// flipBit(int n) 메서드: 지정된 위치 n의 비트를 뒤집음 (1을 0으로, 0을 1로)
BigInteger flipBitResult = bigInteger.flipBit(4);
System.out.println("After Flipping Bit at Position 4: " + flipBitResult);
//After Flipping Bit at Position 4: 123456789012345678901234567958
}
}
'JAVA' 카테고리의 다른 글
Calendar와 Date, 이를 이용한 날짜/ 일수 출력하기 (0) | 2023.12.28 |
---|---|
java.math.BigDecimal, double타입보다 오차가 없도록 2진수로 변환해 수를 다루다 (0) | 2023.12.26 |
String.split()의 구식 api, java.util.StringTokenizer (0) | 2023.12.26 |
java.util.Scanner 입력소스를 읽다 (0) | 2023.12.26 |
java.util.Random 클래스 (0) | 2023.12.22 |