CSAPPLAB1——Datalab(上)
前言:本文为CSAPP3.0配套Lab的刷题笔记,这是第一个lab——Datalab的笔记
每个实验题目将采用以下格式来记录
- 题目描述
- 题解和思路
- 解题代码
bitXor
题目描述
只使用按位与非逻辑实现按位异或逻辑
题解与思路
排除掉两个不能通过的逻辑,写成的代码就能通过。
即:把x与y相同的答案都否定掉
代码
1 | //1 |
tmin
题目描述
返回补码表示数字的最小值。
题解与思路
补码的最小值是符号位为1,其余均为0,所以返回这个数字就行了。
我的思路也很简单粗暴,直接通过移位得到
代码
1 | /* |
isTmax
题目描述
判断一个数是不是补码表示的最大数字,是则返回1,否返回0
题解与思路
补码最大数字应该是符号位为0,其余位均为1,所以将它向左移1位再加1之后得到的应该是全为1的数,此时再按位取反后就得到0,再用逻辑非判断即可。
需要注意的是,补码表示的-1进行上述操作后得到的也是一样的结果,所以要把-1排除了,方法是按位取反得到0,然后用逻辑非把这个结果否定了。
代码
1 | /* |
allOddBits
题目描述
判断所有奇数位是否都为1,如果都为1返回1,否则返回0
PS:这里的位置编号是从0到31
题解与思路
由于只能使用0x00到0xFF间的16进制数,故需要每8位判断1次,所以要考虑移位8、16、24位之后的数字,然后按位取反后与0xAA进行&操作,如果x的奇数位上均为1,取反后应该均为0,与0xAA进行&操作后应均为0,所以再对这个式子求一个逻辑非即可
代码
1 | /* |
negate
题目描述
不用-
操作符返回数字的负值
题解与思路
补码的正常表示,按位取反加一
代码
1 | /* |
isAsciiDigit
题目描述
判断一个数是否是数字’0’到’9’的ASCII码,也即判断一个数字是否位于0x30与0x39之间
题解与思路
若要位于0x30与0x39之间,则这个数减去0x30>=0;减去0x3a<0
代码
1 | /* |
conditional
题目描述
返回操作结果与语句x ? y : z
相同,也即x为1返回y,x为0返回z
题解与思路
先把x利用逻辑非!
转换为0或1,保证我们需要转换的只有0或1,然后接下来就是把0或1转换之后造出一个``0x00000000或者
0xffffffff`再与y和z进行相应的与操作保留y/z即可。
代码
1 | /* |