오른쪽 쉬프트에서
헷갈리는 부분이 있습니다..
(앗.. 혹시 저만.. 그런가요..)


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를 구하는 식이 다르기 때문에
아래 함수에 들어가는 인수가 달라져 보이는 것뿐입니다.

곰곰히 생각해보세요.
정 오른쪽이 이해가 안가시겠다면 왼쪽방법으로 구현하세요. ^^


Posted by 투명테잎