深入理解计算机系统第二章家庭作业(2.68-2.82)

/****2.68*****/
int lower_bits(int x, int n)
{
return x | ((1 << (n - 1) << 1) - 1);
}


//注释部分为中间步骤

/*******2.69***********/
unsigned rotate_right(unsigned x,int n)
{
int w = sizeof(unsigned) << 3;
//unsigned low_n_bits = ((1 << n) - 1) & x;
//unsigned low_to_high = (((1 << n) - 1)) & x << (w - n);
n && (x = ((x >> n) | (((((1 << n) - 1)) & x) << (w - n))));
return x;
}


/**********2.70************/
int fits_bits(int x, int n)
{
//先将第n-1位置零(位的编号从0开始)
int mask = 1 <<(n - 2);


x &= ~mask;


int w = sizeof(int) << 3;


return x == (x << (w - n)) >> (w - n);

}


/*************2.71**************/

A.   按照该扩展方法必定为无符号数,有符号数就会出错

B.

 int xbyte(packed_t word , int bytenum)

{

        return (word << ((3 - bytenum) << 3)) >> 24;

}


/*************2.72*************/

A.   maxbytes会隐式的转换为size_t,而两个无符号数之差必然大于等于0

B.   if(maxbytes >= sizeof(val))


/*************2.73****************/

/*************2.73**************/
/*Addition that saturates to TMin or TMax*/
//判断是否溢出参照练习题2.30
int saturating_add(int x,int y)
{
	int sum = x + y;

	int w = sizeof(int) << 3;

	int max_bit = 1 << (w - 1);

	int x_max = x & max_bit;

	int y_max = y & max_bit;

	int sum_max = sum & max_bit;

	int neg_over = x_max && y_max && (!sum_max);
	int pos_over = (!x_max) && (!y_max) && sum_max;

	neg_over && (sum = (1 << w - 1));
	pos_over && (sum = (1 << w - 1) - 1);

	return sum;
}


 

/*************2.74**************/

/*************2.74**************/
/*Determine whether subtracting arguments will cause overflow*/
int tsub_ovf(int x , int y)
{
	int sum = x - y;

	int w = sizeof(int) << 3;

	int max_bit = 1 << (w - 1);

	int x_max = x & max_bit;

	int y_max = y & max_bit;

	int sum_max = sum & max_bit;
	
	int pos_over = (!x_max) && y_max && sum_max;
	int neg_over = x_max && (!y_max) && (!sum_max);

	return pos_over || neg_over;
}


/*************2.75**************/

unsigned unsigned_high_prod(unsigned x,unsigned y)
{
	int w = sizeof(unsigned) << 3;

	unsigned x_lmb = x >> (w - 1);
	unsigned y_lmb = y >> (w - 1);

	int temp = signed_high_prod((int)x , (int)y);

	return (unsigned)(temp + x_lmb * y + y_lmb * x);

}


/************2.76***************/

A.   (x  <<  2) + x

B.   (x  << 3) + x

C.   (x << 5) - (x << 2)

D.   (x << 3) - (x << 6)


/************2.77***************/

/************2.77***************/
/*Divide by power of two.  Assume 0 <= k <= w-1 */
int divide_power2(int x, int k)
{

	int w = sizeof(int) << 3;

	int x_lmb = x >> (w - 1);

	x_lmb && (x = x + (1 << k) - 1);

	return x >> k;
}


/************2.78***************/

int mul5div8(int x)
{
	x = (x << 2) + x;

	int w = sizeof(int) << 3;

	int x_lmb = x >> (w - 1);

	x_lmb && (x = x + (1 << 3) - 1);

	return x >> 3;
}


/*************2.79******************/

int fiveeighths(int x)
{
	int w = sizeof(int) << 3;

	int x_lmb = x >> (w - 1);

	x_lmb && (x = x + 7);

	x = x >> 3;
	
	return x + (x << 2);
}


 


 

/****************2.80*******************/

A.   ~((1 << n) - 1)

B.   ~(~0 << n) << m


/******************2.81********************/

A.   当y取INT_MIN的时候不成立

B.   无论溢出与否,移位操作总成立

C.   当x与y都取全1的时候不成立

D.   在位级操作上这个等式总是成立的

E.   最后一位的权值总是正的,故等式一定成立


/******************2.82*********************/

A.   Y / (2^k - 1)

B.   k =  3   Y = 1       1/7

       k = 4    Y = 9       9/15

       k = 6    Y = 7       7/63



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值