我尝试将整数乘以(17/64)向下舍入,但我无法处理溢出。 (我仅限于按位运算符 ( ~ & | << >> ! + )
#include <stdio.h>
int mulfrac(int x) {
int mul17 = (x<<4) + x;
int bias = (mul17 >> 31) & 63;
int result = (mul17 + bias) >> 6;
return result;
}
int main() {
int test_values[] = {0, 1, -1, 3, -3, 17, -17, 11, -11, 64, -64, 128, -128, 100, -100, 400, 15, -6, 1234523590, -10000000, -10};
int n_tests = sizeof(test_values) / sizeof(test_values[0]);
for (int i = 0; i < n_tests; i++) {
int x = test_values[i];
int result = mulfrac(x);
printf("mul_17_div_64(%d) = %d\n", x, result);
}
return 0;
}
我不知道该怎么做,因为我尝试了不同的方法但没有成功。我也不能使用 if 和 while
在划分之前添加偏差。为了避免负数的溢出问题,您需要正确舍入结果。这可以通过在除以 64 之前添加负数的“偏差”来完成。