2017-09-08 7 views
0

the restoring division algorithm을 구현하려고하는데 잘못된 결과가 계속 발생합니다. 요령은 비트 연산자, 루프 및 분기 만 사용하여 +, -, *, /, %를 구현해야하는 과제입니다. add(a,b), sub(a,b)mul(a,b)을 성공적으로 구현 했으므로 div(a,b,&rem) 메소드에서 사용했습니다. 여기에 내가 add, submul에 대한 모든 가장자리 사례와 일반적인 예를 테스트 한비트 나누기 연산자를 사용하여 C++에서 사업부 구현 복원

template<typename T> 
T div(T dividend, T divisor, T &remainder){ 
    unsigned q = 1; 
    unsigned n = mul(sizeof(T), CHAR_BIT); 
    remainder = dividend; 
    divisor <<= n; 

    for(int i=sub(n,1); i>=0; i=sub(i,1)) { 
     remainder = sub(remainder << 1, divisor); 
     if(remainder < 0) { 
      q &= ~(1 << i); // set i-th bit to 0 
      remainder = add(remainder, divisor); 
     } else { 
      q |= 1 << i;  // set i-th bit to 1 
     } 
    } 
    return q; 
} 

코드, 그리고 나는 그들이 어떤 정수 입력을 제대로 알고있다.

모든 입력에 대해 q = -1remainder = 0이 표시됩니다. 문제는 T 또는 qn의 서명과 관련이 있다고 생각합니다. 구현 방법이 동일하다고 생각합니다. 이유는 메소드가 -10을 반환하는 이유입니까?

+1

매개 변수는 어떤 유형입니까? Wikipedia 코드에서 주석을 발견 했습니까? ** P와 D는 N과 Q의 단어 폭의 두 배를 필요로합니다 ** – Barmar

+0

@Barmar 제 구현에서'T'는 짧은 것입니다 – Dando18

답변

1

알고리즘을 조금 더 확인해야합니다. if(q < 0) 비교에서 잘못된 변수를 사용하고 있습니다. if (remainder < 0)이어야합니다.

+0

그러나 나는 잡을 수 없었습니다. 여전히 잘못된 결과가 나타납니다. – Dando18