the restoring division algorithm을 구현하려고하는데 잘못된 결과가 계속 발생합니다. 요령은 비트 연산자, 루프 및 분기 만 사용하여 +, -, *, /, %를 구현해야하는 과제입니다. add(a,b)
, sub(a,b)
및 mul(a,b)
을 성공적으로 구현 했으므로 div(a,b,&rem)
메소드에서 사용했습니다. 여기에 내가 add
, sub
및 mul
에 대한 모든 가장자리 사례와 일반적인 예를 테스트 한비트 나누기 연산자를 사용하여 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 = -1
및 remainder = 0
이 표시됩니다. 문제는 T
또는 q
및 n
의 서명과 관련이 있다고 생각합니다. 구현 방법이 동일하다고 생각합니다. 이유는 메소드가 -1
및 0
을 반환하는 이유입니까?
매개 변수는 어떤 유형입니까? Wikipedia 코드에서 주석을 발견 했습니까? ** P와 D는 N과 Q의 단어 폭의 두 배를 필요로합니다 ** – Barmar
@Barmar 제 구현에서'T'는 짧은 것입니다 – Dando18