我需要一种算法来在 C 中进行无符号定点除法。我最多可以使用 32 位字。
我想最小化表示整数部分所需的位数,同时能够使用 [0..15] 范围内的数字。显然,最小位数是 4。问题是我提出的算法只能使用 5 位。因为它将余数与除数进行比较,然后移动余数直到它大于除数,如果除数的最高有效位为 1,那么算法只会移动余数(它永远不会更大)。这是代码:
int divu(int a, int b){
int pt_int, r, pt_frac=0;
int i;
pt_int = ((unsigned) a/b) << BITS_FRAC;
r = (unsigned) a%b;
for (i=BITS_FRAC; i>=0; i--){
if ((unsigned) r < b)
r <<= 1;
else{
r -= b;
pt_frac += 01 << i;
r <<= 1;
}
}
return pt_int + pt_frac;
}
如果您确实有解决方案但不想理解代码,请发布它。:)
例子:
我们想将 1.5 除以 2,得到 0.75。假设我们对整数部分使用 4 位,对小数部分使用 28 位。所以我们的数字是十六进制的:
1.5: 0x18000000
2: 0x20000000
result: 0x0c000000