오른쪽 쉬프트에서
헷갈리는 부분이 있습니다..
(앗.. 혹시 저만.. 그런가요..)
함수 중에
rightShiftBlocks와 leftShiftBits를 구하는 부분이 헷갈릴 수 있습니다.
오른쪽으로 쉬프트 하는 경우는 두가지 경우로 구 할수 있습니다.
n비트를 쉬프트 하는 경우..
두가지 경우를 생각 해볼 수 있습니다.
그 중, 오른쪽 방법을 사용하여 >> 쉬프트 함수를 구현한 것입니다.
둘을 방법론적으로 보면 똑같은 원리입니다.
하지만 초기에 a,b와 c,d를 구하는 식이 다르기 때문에
아래 함수에 들어가는 인수가 달라져 보이는 것뿐입니다.
곰곰히 생각해보세요.
정 오른쪽이 이해가 안가시겠다면 왼쪽방법으로 구현하세요. ^^
헷갈리는 부분이 있습니다..
(앗.. 혹시 저만.. 그런가요..)
const BigInteger BigInteger::operator >>(const int rightmove) const { BigInteger temp; if (sign == Zero) return temp; if (rightmove == 0) return *this; else if (rightmove < 0) return *this << (-rightmove); // 결과값이 0이 나오는 경우 if (unsigned __int64(rightmove) >= bitlength()) return temp; length rightShiftBlocks = (rightmove + N - 1) / N; length leftShiftBits = N * rightShiftBlocks - rightmove; // 이제 (N * rightShiftBlocks - leftShiftBits) == rightmove // 그리고 0 <= leftShiftBits < N 가 성립합니다. // + 1: 최상위 블럭 때문입니다. temp.Reallocate(len + 1 - rightShiftBlocks); index i, j; for (j = rightShiftBlocks, i = 0; j <= len; j++, i++) temp.blk[i] = Get_LShiftedBlock(j, leftShiftBits); if (temp.blk[temp.len - 1] == 0 && temp.len != 1) temp.len--; // 위에서 결과값이 0이 나오는 것을 제거 하였기 때문에 // 그대로 부호를 넣는다. temp.sign = sign; return temp; }
함수 중에
rightShiftBlocks와 leftShiftBits를 구하는 부분이 헷갈릴 수 있습니다.
오른쪽으로 쉬프트 하는 경우는 두가지 경우로 구 할수 있습니다.
n비트를 쉬프트 하는 경우..
a = n/32 b = n%32 x블럭에 Get_LShiftedBlock(x+a+1, 32-b)대입 x는 0부터 len-1-a까지 |
c = (n + 32 - 1)/32 d = (32*c - n) x블럭에 Get_LShiftedBlock(x+c, d)대입 x는 0부터 len-1-c까지 |
두가지 경우를 생각 해볼 수 있습니다.
그 중, 오른쪽 방법을 사용하여 >> 쉬프트 함수를 구현한 것입니다.
둘을 방법론적으로 보면 똑같은 원리입니다.
하지만 초기에 a,b와 c,d를 구하는 식이 다르기 때문에
아래 함수에 들어가는 인수가 달라져 보이는 것뿐입니다.
곰곰히 생각해보세요.
정 오른쪽이 이해가 안가시겠다면 왼쪽방법으로 구현하세요. ^^
'프로젝트 > 큰수 클래스(Big Numerics)' 카테고리의 다른 글
[BigInteger - 12] 뺄셈 (0) | 2011.07.08 |
---|---|
[BigInteger - 11] 덧셈 (0) | 2011.07.07 |
[BigInteger - 9] 쉬프트 연산(Part2) (0) | 2011.07.05 |
[BigInteger - 8] 쉬프트 연산(Part1) (0) | 2011.07.01 |
[BigInteger - 7] 비트연산 (0) | 2011.07.01 |