欢迎光临散文网 会员登陆 & 注册

初探CSAPP:datalab1的一些思考

2023-03-28 22:23 作者:linda耶耶耶  | 我要投稿

用一周的时间写完了datalab,希望这学期能把8个实验写完吧,我的计算机底层知识还是很薄弱,总结一下,把重点的思路和题发出来。

环境的话我使用的是wsl,安装ubuntu2022,相比虚拟机真的是快了很多,只不过没有图形界面。

condtional

题目:

 * conditional - same as x ? y : z

 *   Example: conditional(2,4,5) = 4

 *   Legal ops: ! ~ & ^ | + << >>

 *   Max ops: 16

 *   Rating: 3

思路:

 和数字电路不同 x≠0 -->y 否则 x=0 -->z, 先把x转化为bool逻辑值,如果x不为0,x的bool值就是1,然后还要把bool值转化为, 我理解的数值值,0---0,1---FFFFFFFF

 要注意 ~ !的区别,~是按位取反,!是逻辑取反。

 我最开始的思路是int sign = x^0; 异或提取,但是这样是不对的,异或对每一位都进行了操作

logicalNeg

题目:

logicalNeg - implement the ! operator, using all of

 *              the legal operators except !

 *   Examples: logicalNeg(3) = 0, logicalNeg(0) = 1

 *   Legal ops: ~ & ^ | + << >>

 *   Max ops: 12

 *   Rating: 4

思路:

  这道题需要求出逻辑反,我认为基本舍弃了,通过逻辑运算,异或等等来完成,因为这些都只能按位算,没办法实现逻辑上的操作。对于逻辑为0的数而言,只有0本身。所以从0这个数找一些特点。0的补码依然为0 ,不论是用10000,还是0000来表示,补码仍等于本身。

 用x -x+1符号就进行符号比较,符号位相同则为0,我最开始实现的是((x>>31)^((~x+1)>>31))+1,但是这个是有问题的,右移过程,如果符号位是1,直接就补满1,这是算术右移的特性,所以需要想办法先把符号位提取出来

 howManyBits

这个题是二分法,当时没想出来,看的网友的答案

floatFloat2Int

要想把浮点数,转化为定点数,首先要把符号位,指数位,小数位全都单独表示出来,单精度浮点数,存在一个偏移量,8位指数部分,偏移量127.8bit本来可以表示0-255,但是 0  和 255被表示为无穷和0,非数。所以只能从1-254表示,减去偏移指数 -126到127。

 floatPower2

把一个数做运算,得到2^x次幂,这道题困扰了很久,主要问题是没弄清楚规格数和非规格数之间的关系。1位符号位 8位指数位 23位尾数位,为了表示趋近于0的数,趋近于无穷大的数整个浮点数被分为规格和非规格两类。

更多内容指路下面的知乎大佬的答案

https://zhuanlan.zhihu.com/p/343049681

最后的最后:

菜鸡的日常自救-->


初探CSAPP:datalab1的一些思考的评论 (共 条)

分享到微博请遵守国家法律