CSAPP第二章家庭作业2.63

题目

2.63.1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

unsigned srl(unsigned x, int k) {
//Perform shift arithmetically
unsigned xsra = (int)x >> k;
//将算术右移补符号位替换成0,完成逻辑右移
xsra &= ((unsigned)-1 >> k);
return xsra;
}
int sra(int x, int k) {
//Perform shift logically
int xsrl = (unsigned)x >> k;
//将逻辑右移的补高位0替换成算术右移的符号位
int w = sizeof(int) << 3; //获取位长w
int z = 1 << (w - k - 1); //
int mark = z - 1; //
int right = xsrl & mark;
int left = ~mark & (~(z&xsrl)+z); //不理解。

// printf("%x\n", xsrl);
// printf("%x\n", (z&xsrl));
// printf("%x\n", (~(z&xsrl)+z));
return left | right;
}
int main() {
printf("%x\n", srl(0xF2345678, 8));
printf("%x\n", sra(0xF2345678, 8));
return 0;
}

总结

脑短路、好难啊