虽然答案已被接受,但我还是发布我的答案。
更新。这是通过乘以一个循环二进制分数来实现的。十进制 1/9 = 0.1111111 重复出现。在二进制中,即 1/1001 = 0.000111000111000111 重复出现。
请注意,二进制乘法器以 6 位为一组,十进制 7 重复出现。所以我在这里要做的是将被除数乘以 7,将其右移 6 位,然后将其添加到运行商中。但是为了保持重要性,我在加法之后进行移位,并在循环结束后将商q 移位以正确对齐。
对于 32 位 int(6 位 * 6 次移位 = 36 位),计算循环最多有 6 次迭代。
#include<stdio.h>
int main(void)
{
unsigned x, y, q, d;
int i, err = 0;
for (x=1; x<100; x++) { // candidates
q = 0; // quotient
y = (x << 3) - x; // y = x * 7
while(y) { // until nothing significant
q += y; // add (effectively) binary 0.000111
y >>= 6; // realign
}
q >>= 6; // align
d = x / 9; // the true answer
if (d != q) {
printf ("%d / 9 = %d (%d)\n", x, q, d); // print any errors
err++;
}
}
printf ("Errors: %d\n", err);
return 0;
}
不幸的是,由于与乘以十进制 27 * 0.111111 = 2.999999 而不是 3 相同的原因,这对于每个 9 的倍数的候选者来说都失败了,因为舍入错误。所以我现在通过保留 4 ls 来使答案复杂化。用于舍入的商的位。结果是它适用于所有int 值,由两个顶部半字节限制,一个用于* 7,一个用于* 16 意义。
#include<stdio.h>
int main(void)
{
unsigned x, y, q, d;
int i, err = 0;
for (x=1; x<0x00FFFFFF; x++) {
q = 8; // quotient with (effectively) 0.5 for rounding
y = (x << 3) - x; // y = x * 7
y <<= 4; // y *= 16 for rounding
while(y) { // until nothing significant
q += y; // add (effectively) binary 0.000111
y >>= 6; // realign
}
q >>= (4 + 6); // the 4 bits significance + recurrence
d = x / 9; // the true answer
if (d != q) {
printf ("%d / 9 = %d (%d)\n", x, q, d); // print any errors
err++;
}
}
printf ("Errors: %d\n", err);
return 0;
}