寻找神秘的Nums M / N

时间:2017-11-03 05:15:25

标签: c bit-shift

我很确定我做得对,只是想确定... 在下面的代码中,我们省略了常量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

我这样做了吗?

0 个答案:

没有答案