初探CSAPP:datalab1的一些思考
用一周的时间写完了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
最后的最后:
菜鸡的日常自救-->
