CSAPP:Lab1 DataLab

内容会不断更新。

配置过程是下载清华大学打包好的镜像,用虚拟机运行Ubuntu,再开启共享文件夹进行使用。

问题1:bitXOR

用~和&实现异或。思路是输入为0011和0101,输出为0110即可。(真值表的二进制化)

先使用一至两次~和&组合出0100和0010,但由于没有|也没有+,转而通过先~再&再~,转化为其反面来实现这一功能。

最终为return ~(~(~A&B)&(~(A&(~B))));

问题2:tmin

直接通过左移位完成即可。(也许可以开挂写-2147483648?)

最终为return 1<<31;

问题3:isTmax

注意到Tmax的显著特点是即将溢出,溢出后位表示完全变化。故有性质x^(x+1)==0

但同样的,-1也有这一性质,因为截断也会使位表示完全变化。还需加入限定条件x+1 != 0

在这个问题中,对所有其他条件返回一个相同值时,!的价值就体现了出来。可惜始终表示否定,有时当满足不适用条件时表达式值为零,则不得不使用两层嵌套。

最终为return !(~(x^(x+1)))&(!(!(x+1));

问题4:Alloddbits

问题5:negate

根据反码定义启发即可

最终为return ~x+1;

问题6:isASCIIdigit

观察范围,得出倒数第二个十六进制位是3,采用右移+异或比较,最左十六进制位打头为0(右移+异或)或者是100+0/1。

最终为return;

问题7:conditional

采取输出数&控制数的结构来组织解,控制数为0不输出,为-1输出。条件的0与非零利用对应的运算转化到0和-1即可。

最终为:return ;

未完待续。

posted @ 2021-09-25 16:22  Phile-matology  阅读(65)  评论(0)    收藏  举报