CSAPPLAB1——Datalab(下)

前言:本文为CSAPP3.0配套Lab的刷题笔记,这是第一个lab——Datalab的笔记

每个实验题目将采用以下格式来记录

  • 题目描述
  • 题解和思路
  • 解题代码

isLessOrEqual

题目描述

如果x<=y,返回1,否则返回

题解与思路

本来刚开始一看:诶,这简单嘛,让y-x>=0就行了嘛,就想着写个y+x的相反数然后判断它的符号位,然后没想到又是该死的TMin,这该死的按位取反加一仍然为它本身的数字!还有一个原因是如果相减的结果大于Tmax会溢出为负数,也会有错误,所以修改了实现的逻辑

分成两种情况:x和y符号相同和不同时:y为正为真 x和y符号相同时:y-x>0为真 由于溢出只有在x和y异号的时候才会出现,所以这种方法巧妙的规避了溢出的情况

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 
* isLessOrEqual - if x <= y then return 1, else return 0
* Example: isLessOrEqual(4,5) = 1.
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 24
* Rating: 3
*/
int isLessOrEqual(int x, int y) {
int xsign = x>>31;
int ysign = y>>31;
int check = xsign^ysign;
int yminusx = (y+~x+1)>>31;
return (check&(!ysign))|(!check&(!yminusx));
}

logicalNeg

题目描述

不使用逻辑非 '!' 实现逻辑非 '!'

题解与思路

  1. 在所有数字中,只有0和Tmin取它的补码相反数后还为它本身,也即~0+1=0,~Tmin+1=Tmin而Tmin为0x80000000,符号位为1,所以可以将x取补码的相反数后判断符号位是否为0

  2. 转换为考虑筛选出x<0&&x>=1的数字然后返回0

代码

1
2
3
4
5
6
7
8
9
10
11
/* 
* 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
*/
int logicalNeg(int x) {
return ((x>>31)+1)&((x+~1+1>>31)&1);
}

今日体重

image-20210811002904543