我很确定我做得对,只是想确定... 在下面的代码中,我们省略了常量M和N的定义
以下是arith和optarith中的两个函数:
#define M /* Mystery number 1 */
#define N /* Mystery number 2 */
unsigned int arith(unsigned int x, unsigned int y){
unsigned int result = 0;
result = x * M + y/N;
return result;
}
我们为M和N的特定值编译了此代码。编译器优化了乘法和 师。以下是将生成的机器代码转换回 C:
unsigned int optarith(unsigned int x, unsigned int y){
unsigned int t = 3 * x;
x <<= 6;
x -= 2 * t;
y >>= 4;
y = y/3;
return x + y;
}
所以这是我的工作 所以为操作M * x
找到值M.x <<= 6; // same as x = x * 64
x-= 2 * t; //same as x = x - 2 * (3 * x)
所以基本上x = 64x - 6x,这只是58x因此M = 58
并找到操作y / N的值N
y >>= 4; same as y = y/16;
y = y/3; same as y = (y/16)/3;
使y / 48如此N = 48
我这样做了吗?