我需要一个算法,在C语言中可以做无符号定点除法。我最多可以使用32位字。希望能最小化整数部分所需的位数,并能够使用范围在[0..15]内的数字。显然,最小位数为4位。问题是,我提出的算法只适用于5位。因为它将余数与除数进行比较,然后将余数移位直到大于除数,如果除数的最高位为1,则算法将仅对余数进行移位(它永远不会变得更大)。以下是代码:
如果你已经有解决方案,但不想了解代码,请直接发布它。 :)
例如:
我们想把1.5除以2,结果为0.75。假设我们使用4位整数部分和28位小数部分。所以我们的数字是十六进制的:
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