深入理解计算机系统(第二版)-家庭作业答案



《深入理解计算机系统(第二版)-家庭作业答案》由会员分享,可在线阅读,更多相关《深入理解计算机系统(第二版)-家庭作业答案(95页珍藏版)》请在文档大全上搜索。
1、深入理解计算机系统(第二版) 家庭作业 第二章 2.55-2.57 略2.58int is_little_endian() int a = 1; return *(char*)&a);2.59(x&0xFF) | (y&0xFF)2.60unsigned replace_byte(unsigned x, unsigned char b, int i)
2、 return (x & (0xFF<<(i<<3) | (b << (i<<3);2.61A. !xB. !xC. !(x>>(sizeof(int)-1)<<3)D. !(x&0xFF)注意,英文版中C是最低字节,D是最高字节。中文版恰好反过来了。这里是按中文版来做的。2.62这里我感觉应该是英文版对的,int_shifts_are_arithmetic()int int_shifts_ar
3、e_arithmetic() int x = -1; return (x>>1) = -1;2.63对于sra,主要的工作是将xrsl的第w-k-1位扩展到前面的高位。这个可以利用取反加1来实现,不过这里的加1是加1<<(w-k-1)。如果x的第w-k-1位为0,取反加1后,前面位全为0,如果为1,取反加1后就全是1。最后再使用相应的掩码得到结果。对于srl,注意工作就是将前面的高位清0,即xsra & (1<<
4、;(w-k) - 1)。额外注意k=0时,不能使用1<<(w-k),于是改用2<<(w-k-1)。 int sra(int x, int k) int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; unsigned z = 1
5、 << (w-k-1); unsigned mask = z - 1; unsigned right = mask & xsrl; unsigned left = mask & (z&xsrl) + z); return left | ri
6、ght;int srl(unsigned x, int k) int xsra = (int) x >> k; int w = sizeof(int)*8; unsigned z = 2 << (w-k-1); return (z -
7、0;1) & xsra;2.64int any_even_one(unsigned x) return !(x & (0x55555555);2.65int even_ones(unsigned x) x = (x >> 16); x = (x >> 8);
8、; x = (x >> 4); x = (x >> 2); x = (x >> 1); return !(x&1); x的每个位进行异或,如果为0就说明是偶数个1,如果为1就是奇数个1。那么可以想到折半缩小规模。最后一句也可以是 return (x1)&12.66根据提示想到利用或运算,将
9、最高位的1或到比它低的每一位上,忽然想如果x就是10000000.该如何让每一位都为1。于是便想到了二进扩展。先是x右移1位再和原x进行或,变成1100000.,再让结果右移2位和原结果或,变成11110000.,最后到16位,变成11111111.。int leftmost_one(unsigned x) x |= (x >> 1); x |= (x >> 2); &
10、#160; x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return x(x>>1);2.67A.32位机器上没有定义移位32次。B.beyond_msb变为 2<<31。C.定义 a = 1<<15;
11、 a<<=15; set_msb = a<<1; beyond_msb = a<<2;2.68感觉中文版有点问题,注释和函数有点对应不上,于是用英文版的了。个人猜想应该是让x的最低n位变1。int lower_one_mask(int n) return (2<<(n-1) - 1;2.69unsigned rotate_right(unsigned x, int n) int