문제

내장 된 디비전 작업을 사용하지 않고 MIPS에서 두 개의 서명 된 정수 사이의 구분을 수행하는 방법을 아는 사람이 궁금합니다.

문제 사양에서 Divisor Register, ALU 및 Quotient Register의 너비는 모두 32 비트이며 나머지 레지스터는 64 비트라고 들었습니다.

도움이 되었습니까?

해결책

손으로 바이너리 분할을 수행하는 방법을 생각해보십시오.

# a/b, where a=2011 and b=18

            1101111 ←quotient
      ┌────────────         ↓
10010 │ 11111011011  a
       -10010↓↓↓↓↓↓  -64b × 1
       ───────↓↓↓↓↓
         11010↓↓↓↓↓
        -10010↓↓↓↓↓  -32b × 1
        ───────↓↓↓↓
          10001↓↓↓↓
         -00000↓↓↓↓  -16b × 0
         ───────↓↓↓
          100011↓↓↓
          -10010↓↓↓   -8b × 1
          ───────↓↓
           100010↓↓
           -10010↓↓   -4b × 1
           ───────↓
            100001↓
            -10010↓   -2b × 1
            ───────
              11111
             -10010   -1b × 1
             ──────                
               1101  remainder

이 "초

def unsigned_divide(dividend, divisor):
    if divisor == 0:
        raise ZeroDivisionError()
    if dividend < divisor:
        return 0
    # Determine the position of the first digit of the quotient
    shift_amt = dividend.bit_length() - divisor.bit_length()
    # Loop to find each bit of the quotient
    quotient = 0
    while shift_amt >= 0:
        # Calculate one bit of the quotient
        if dividend >= (divisor << shift_amt):
             # new bit is 1
             dividend -= (divisor << shift_amt)
             quotient |= (1 << shift_amt)
        # Move to the next digit
        shift_amt -= 1
    return quotient

서명 된 부서의 경우 부호를 추적하면서 절대 값을 나눌 수 있습니다 (C 스타일 절단 부문을 원한다고 가정) :

def signed_divide(dividend, divisor):
    is_negative = (dividend < 0) ^ (divisor < 0)
    abs_quotient = unsigned_divide(abs(dividend), abs(divisor))
    return -abs_quotient if is_negative else abs_quotient

다른 팁

다양한 방법이 있습니다. 제안하겠습니다 뉴턴-랩슨, 단순하고 빠르며 곱셈과 뺄셈 만 사용합니다.

곱셈이 허용되지 않으면 교대 근무, 비트 동작 및 추가/빼기를 사용하는 정수 디비전 알고리즘이 많이있는 것 같습니다. www.bearcave.com/software/divide.htm

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top