본문 바로가기
JAVA BASE/lang & util

13. [자바] BigInteger클래스

by staticClass 2020. 12. 28.

BigInteger클래스?

정수형으로 표현할 수 있는 값의 한계가 있는데 가장 큰 정수형 타입인 long으로도 10진수 19자리 정도이다.
이 값도 상당히 큰 값이지만, 분명 더 큰 값을 다뤄야 할 때가 있는데 이럴때 BigInteger를 사용하면 좋다.
BigInteger는 내부적으로 int배열을 사용해 값을 다루기 때문에 long타입보다 훨씬 큰 값을 다룰 수있지만
성능은 long타입보다 떨어진다.

final int signum; // 부호. 1(양수), 0, -1(음수) 셋 중의 하나
final int[] mag; // 값(magnitude)

BigInteger도 String처럼 불변이다.

BigInteger의 생성

BigInteger는 정수형으로는 표현할 수 있는 값의 한계가 있기 때문에 문자열로 숫자를 표현하는 것이 일반적이다.

BigInteger val;
val = new BigInteger("12345678901234567890"); // 문자열로 생성
val = new BigInteger("FFFF", 16); // n진수(radix)의 문자열로 생성
val BigInteger.valueOf(1234567890L); // 숫자로 생성

다른 타입으로의 변환

BigInteger를 문자열, byte배열로 변환이 가능하고
Number클래스로부터 상속받은 기본형으로 변환하는 메서드들도 가지고 있다

BigInteger bi = new BigInteger("123456789");
bi.toString(); // 문자열
bi.toByteArray(); // byte[]
bi.intValue(); // int
bi.longValue(); // long
bi.floatValue(); // float
bi.doubleValue(); // double

정수형으로 변환하는 메서드 중 이름 끝에 'Exact'가 붙은 것들은 변환한 결과가
변환한 타입의 범위에 속하지 않으면 ArithmeticException을 발생시킨다.

bi.byteValueExact();
bi.intValueExact();
bi.longValueExact();

BigInteger의 연산

BigInteger에는 모든 연산자와 수학적인 계산을 쉽게 해주는 메서드들이 정의되어 있다.
몇가지만 보도록 하자.

BigInteger add(BigInteger val) // 덧셈(this + val)
BigInteger subtract(BigInteger val) // 뺄셈(this - val)
BigInteger multiply(BigInteger val) // 곱셈(this * val)
BigInteger divide(BigInteger val) // 나눗셈(this / val)
BigInteger remainder(BigInteger val) // 나머지(this % val)

비트 연산 메서드

int bitCount() // 2진수로 표현했을 때, 1의 개수(음수는 0의 개수)를 반환
int bitLength() // 2진수로 표현했을 때, 값을 표현하는데 필요한 bit수
boolean testBit(int n) // 우측에서 n+1번째 비트가 1이면 true, 0이면 false
BigInteger setBit(int n) // 우측에서 n+1번째 비트를 1로 변경
BigInteger clearBit(int n) // 우측에서 n+1번째 비트를 0으로 변경
BigInteger flipBit(int n) // 우측에서 n+1번째 비트를 전환(1→0, 0→1)

댓글