乘法与除法练习

《深入理解计算机系统》之练习题2.43:在下列代码中,我们省略了常数M和N的定义:
#define M
#define N
int arith(int x,int y)
{
	int result = 0;
	result = x*M+y/N;
	return result;
}

我们以某个M和N的值编译这一段代码。编译器用我们讨论过的方法优化乘法和除法。下面是将产生出的机器代码翻译回来C语言的结果:

int test(int x,int y)
{
	int t=x;
	x<<=5;
	x-=t;
	if(y<0)
	{
		y+=7;
	}
	y>>=3;
	return x+y;
}

M和N的值分别是多少?


先分析M的值:

1:根据int t =x;   x= x<<5;    x =x-t; 推断出 x = x<<5 +x;  特别注意下红色标记的代表入参时候的值;

2:x = x<<5 +x = x<<5 +(2的0次方)xx<<5 +x<<0;

3:根据 y*k    k的2进制表示假如为0110    连续1的最高位n=2,最低位m=1;推断出定理y*k=(y<<(n+1)-(y<

4:类似的 : x x<<5 +x<<0;推断出连续1的最高位是n=4 ,最低位m=0; 也就是二进制表示为 11111转化为十进制为31

5:所以M的值为31,也就是x x *31;


再分析N的值:

1:根据y = y>>3;得出 y = y/(2的3次方)   也就是y = y/8; 得出结论N=8;

2:y<0的时候,会存在偏移量,这里的偏移量是7,7 = (2的3(跟y>>3的3一致)次方 )- 1;所以更加肯定N=8;


然后就是验证阶段了,这里我用的是C++语言,原理都是相同的:

#include 
#include 
using namespace std;

int test(int x,int y)
{
	int t=x;
	x<<=5;
	x-=t;
	if(y<0)
	{
		y+=7;
	}
	y>>=3;
	return x+y;
}



int main()
{
	cout<

打印出:

乘法与除法练习_第1张图片

也就是 33 = 1*31+16/8

你可能感兴趣的:(乘法与除法练习)