(11.10.1 일짜로
CompareTo함수이름을 compare로 바꾸었으며
private영역에서 public영역으로 바뀌었습니다.)
비교연산 부분입니다.
compare 함수는 부호에 상관없이 두 BigInteger형의 크기를 비교합니다.
(두 BigInteger형이 절대값을 비교한다고 생각하시면 됩니다.)
덧셈과 뺄셈함수에서 사용하기 위해 만들어졌습니다.
여러 연산을 만들면서, 대부분의 연산이 비슷한 순서로 처리 가능함을 알게되었습니다.
다음이 그것입니다.
(비교연산, 쉬프트연산, 사칙연산.. 모든 연산과정이 비슷합니다.)
위의 순서도를 바탕으로 compare함수를 설명드리겠습니다.
리턴값은 정수형이며
a.compare(b); 호출 시
같으면 0,
a가 크면 1,
b가 크면 -1
이 리턴됩니다.
1. 단계로 this와 x의 주소가 같은지를 비교합니다.
a.CompareTo(a)를 호출한 경우로, 당연히 같은 수이므로 0입니다.
2. 부호가 다름은 조사하지 않습니다.
CompareTo함수는 두 빅인티저형의 크기를 비교하는 함수이므로
부호의 다름은 필요치 않습니다.
3. len의 크기를 비교합니다.
len이 크다면 무조건 숫자가 더 큰것입니다.
4. 위에서 모든 경우를 배제하면 끝으로는
두 빅인티저형이 len이 같은 경우만 남습니다.
이제는 while문으로 높은자리부터 한블럭씩 비교합니다.
비교연산자 오버로딩도 위와 비슷한 과정으로 만들어졌습니다.
그러나 처음에는 ==, >연산만 만들었습니다.
하지만 >=연산과 <연산에서 똑같은 수를 두번이나 루프를 돌아야하는 경우가 생깁니다.
>이 false라면, ==연산에서 같은지 비교해야 합니다.
그래서 >=연산도 정의하였습니다.
CompareTo함수이름을 compare로 바꾸었으며
private영역에서 public영역으로 바뀌었습니다.)
비교연산 부분입니다.
compare 함수는 부호에 상관없이 두 BigInteger형의 크기를 비교합니다.
(두 BigInteger형이 절대값을 비교한다고 생각하시면 됩니다.)
덧셈과 뺄셈함수에서 사용하기 위해 만들어졌습니다.
여러 연산을 만들면서, 대부분의 연산이 비슷한 순서로 처리 가능함을 알게되었습니다.
다음이 그것입니다.
(비교연산, 쉬프트연산, 사칙연산.. 모든 연산과정이 비슷합니다.)
/* * 연산의 순서도(this, x) * * 1. 주소가 같은가 다른가 ? * ㄱ. 같을 경우 - (처리) * ㄴ. 다를 경우 - (다음으로) * 2. 부호가 같은가 다른가 ? * ㄱ. Zero 존재 * a. 둘 다 0 - (처리) * b. this만 0 - (처리) * c. x만 0 - (처리) * ㄴ. 두 개의 부호가 다를 경우 - (처리) * ㄷ. 부호가 서로 같을 경우 - (다음으로) * 3. 길이가 같은가 다른가 ? * ㄱ. 다를 경우 - (처리) * ㄴ. 같은 경우 - (다음으로) * 4. 그 외 경우 처리 * * 연산에 따라서 * 일부는 생략 가능 혹은 바뀔 수 있음 */
위의 순서도를 바탕으로 compare함수를 설명드리겠습니다.
리턴값은 정수형이며
a.compare(b); 호출 시
같으면 0,
a가 크면 1,
b가 크면 -1
이 리턴됩니다.
const int BigInteger::compare(const BigInteger &x) const { if (this == &x) return 0; if (len < x.len) return -1; else if (len > x.len) return 1; else { // 한블럭씩 높은자리부터 비교합니다. length i = len; while (i > 0) { i--; if (blk[i] == x.blk[i]) continue; else if (blk[i] > x.blk[i]) return 1; else return -1; } // 모든 블럭이 같은 경우이므로, 크기가 같습니다. return 0; } }
1. 단계로 this와 x의 주소가 같은지를 비교합니다.
a.CompareTo(a)를 호출한 경우로, 당연히 같은 수이므로 0입니다.
2. 부호가 다름은 조사하지 않습니다.
CompareTo함수는 두 빅인티저형의 크기를 비교하는 함수이므로
부호의 다름은 필요치 않습니다.
3. len의 크기를 비교합니다.
len이 크다면 무조건 숫자가 더 큰것입니다.
4. 위에서 모든 경우를 배제하면 끝으로는
두 빅인티저형이 len이 같은 경우만 남습니다.
이제는 while문으로 높은자리부터 한블럭씩 비교합니다.
비교연산자 오버로딩도 위와 비슷한 과정으로 만들어졌습니다.
그러나 처음에는 ==, >연산만 만들었습니다.
bool BigInteger::operator ==(const BigInteger &x) const {/* 함수 정의 */} bool BigInteger::operator !=(const BigInteger &x) const {return !(*this == x);} bool BigInteger::operator >(const BigInteger &x) const {/* 함수 정의 */} bool BigInteger::operator >=(const BigInteger &x) const {return (*this > x || *this == x);} bool BigInteger::operator <(const BigInteger &x) const {return !(*this >= x);} bool BigInteger::operator >=(const BigInteger &x) const {return !(*this > x);}
하지만 >=연산과 <연산에서 똑같은 수를 두번이나 루프를 돌아야하는 경우가 생깁니다.
>이 false라면, ==연산에서 같은지 비교해야 합니다.
그래서 >=연산도 정의하였습니다.
'프로젝트 > 큰수 클래스(Big Numerics)' 카테고리의 다른 글
[BigInteger - 8] 쉬프트 연산(Part1) (0) | 2011.07.01 |
---|---|
[BigInteger - 7] 비트연산 (0) | 2011.07.01 |
[BigInteger - 5] 기본형으로부터의 생성 / 변환 (1) | 2011.06.29 |
[BigInteger - 4] 초기화 (0) | 2011.06.28 |
[BigInteger - 3] 생성자 개요 (0) | 2011.06.28 |