[英]64 bit / 64 bit remainder finding algorithm on a 32 bit processor?
我知道過去也曾問過類似的問題,但是經過很長的過程,我已經實現了使用重復減法除法來正確找到商的算法。 但是我無法從這種方法中找到其余的內容 。 是否有任何快速簡便的方法來找出32位處理器上64位/ 64位除法中的余數 。 更確切地說,我正在嘗試實施
ulldiv_t __aeabi_uldivmod(
unsigned long long n, unsigned long long d)
本文檔中引用了http://infocenter.arm.com/help/topic/com.arm.doc.ihi0043d/IHI0043D_rtabi.pdf
什么? 如果您重復進行減法運算(聽起來確實很基礎),那么剩下的難道就不是像您不能再進行一次減法運算時所剩下的一樣簡單嗎?
至少這是幼稚的直觀方式:
uint64_t simple_divmod(uint64_t n, uint64_t d)
{
if (n == 0 || d == 0)
return 0;
uint64_t q = 0;
while (n >= d)
{
++q;
n -= d;
}
return n;
}
還是我想念小船,在這里?
當然,對於大量用戶而言,這將非常慢,但這是重復的減法。 我敢肯定(甚至不看!)還有更高級的算法。
這是一個除法算法,以O(log(n / d))運行
uint64_t slow_division(uint64_t n, uint64_t d)
{
uint64_t i = d;
uint64_t q = 0;
uint64_t r = n;
while (n > i && (i >> 63) == 0) i <<= 1;
while (i >= d) {
q <<= 1;
if (r >= i) { r -= i; q += 1; }
i >>= 1;
}
// quotient is q, remainder is r
return q; // return r
}
如果僅需要r(余數),則可以刪除q(商)。 您可以將每個中間變量i,q,r實現為一對uint32_t,例如i_lo,i_hi,q_lo,q_hi ..... shift,加法和減法lo和hi是簡單的操作。
#define left_shift1 (a_hi, a_lo) // a <<= 1
{
a_hi = (a_hi << 1) | (a_lo >> 31)
a_lo = (a_lo << 1)
}
#define subtraction (a_hi, a_lo, b_hi, b_lo) // a-= b
{
uint32_t t = a_lo
a_lo -= b_lo
t = (a_lo > t) // borrow
a_hi -= b_hi + t
}
#define right_shift63 (a_hi, a_lo) // a >> 63
{
a_lo = a_hi >> 31;
a_hi = 0;
}
等等。
除數0仍未解決:-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.