例如,当不使用整数除法时,以下为真
x/4 + x/2 = x*(1/4+1/2) = x * 3/4
在处理整数除法时,有没有办法减少x/4 + x/2
到这种形式:
x * (int1/int2)
?如果是这样,怎么做?
例如,当不使用整数除法时,以下为真
x/4 + x/2 = x*(1/4+1/2) = x * 3/4
在处理整数除法时,有没有办法减少x/4 + x/2
到这种形式:
x * (int1/int2)
?如果是这样,怎么做?
这个问题reduce x/4 + x/2 into this form: x * (int1/int2)
似乎不是您想要的查询。强制(int1/int2)
除法首先简单的结果int3
。
所以让我们一起工作
reduce x/4 + x/2 into this form: (x * int1)/int2
正如其他人所提到的,这有一些问题暗示它是不可能的。因此,我将提出另一种可能对您有用的形式,因为它仍然是一种访问方式x
并且没有分支。
reduce x/4 + x/2 into this form: ((x/int1)*int2)/int3
x/4 + x/2
减少到((x/2)*3)/2
. 它利用的4
是 的倍数2
。
注意:对于大的|x|
开头INTMAX/3*2
左右,仍有溢出的可能性。
测试代码
int test2(int x) {
int y1 = x/4 + x/2;
int y2 = ((x/2)*3)/2;
printf("%3d %3d %3d %d\n", x, y1, y2, y1==y2);
return y1==y2;
}
我不认为你能做到这一点。举个例子
5 \ 3 + 5 \ 2 = 1 + 2 = 3
其中\
表示整数除法。
现在用正则除法看同一个表达式
a / b + a / c = a(b + c) / bc
如果我们尝试将此规则应用于上面的示例,替换\
为/
,我们会得到:
5 \ 3 + 5 \ 2 = 5(3 + 2) \ (2 * 3) = 25 \ 6 = 4 [wrong answer!]
^^^
This must be wrong
我并不是要声称不存在与此类似的某种身份是正确的。