본문 바로가기
NeoAxiom

NxBigInt 클래스 구현 : DivideAndStoreRemain() 함수

by 작은별하나 2015. 1. 19.
반응형

진법을 바꾸기 위해서는 가장 중요한 함수가 진수로 숫자를 나누어서 그 결과를 저장해야 합니다.  이 함수는 기본적으로 int32 형의 나눗셈만 적용을 합니다.  그 이상 되는 것은 보안 등에서는 꼭 필요한 부분이지만, 현재는 미구현 상태입니다.


DivideAndStoreRemain() 함수는 해당 수로 나누어서 결과를 해당 수에다 저장합니다.  그렇게 하지 않는다면, 많은 경우에 복사연산이 생깁니다.  그래서 부득이 그렇게 작성을 했습니다.  대부분 경우에 나눈 결과를 해당 오브젝트가 저장하는 것이 대부분이니까요.  해당 오브젝트 내용을 저장하고자 한다면, 이 함수를 호출하기 전에 bigint 수를 복사한 후 실행을 해주셔야 합니다.


C/C++ 연산자에는 나눗셈과 나머지 연산을 동시에 할 수 있는 것이 없습니다.  실제 어셈블리어에는 idiv 라는 명령어가 이를 처리합니다.  그래서 어셈블리어로 짤까 생각했는데, 최적화 옵션을 켜고 실행하면, 해당 부분은 자동으로 idiv를 이용해서 한번에 몫과 나머지를 계산합니다.  그래서 별다른 조치를 취하지 않아도 될 것이라 생각합니다.


매 연산마다 m_nLen에 값을 써주기 위해서 조건을 검사해야 하는 부분은 조금 아쉬운 생각이 듭니다.  딱히 좋은 방법이 떠오르지 않아서, 연산할 때, 자동으로 계산하게 하였습니다.



NxBigInt &NxBigInt::DivideAndStoreRemain(int divisor, int *residue)
{
    if( divisor <= 0 ) return *this;

    uint64_t n = 0, q;
    bool flag = true;
    int maxlen = m_nLen;
    for( int i = m_nLen-1 ; i >= 0 ; i-- )
    {
        n <<= 32;
        n |= m_pnData[i];
        q = n/divisor;
        m_pnData[i] = q;
        n %= divisor;
        if( flag && q == 0 ) maxlen = i; else flag = false;
    }

    *residue = n;
    m_nLen = maxlen >= 1?maxlen:1;

    return *this;
}


728x90

'NeoAxiom' 카테고리의 다른 글

NxBigInt 클래스 구현  (0) 2015.01.19
NxBigInt 클래스 설계  (0) 2015.01.15

댓글