csapp-datalab
csapp-datalab
文件任务可以参考https://shimo.im/docs/8pKdVCQVXTXyTY3W/
前置知识:
1 | ~ :非运算符 如 ~0010 = 1101 |
1.位运算
1.bitXor
将^运算用~和&表示
1 | int bitXor(int x, int y) { |
比较简单。
2.tmin
返回最小int值
1 | int tmin(void) { |
3.isTmax
通过位运算计算是否是补码最大值,int范围-2147483648——2147483647即~0x7fffffff——0x7fffffff
0x7fffffff + 1 = ~ 0x7fffffff,特例是-1.
1 | int isTmax(int x) { |
4.allOddBits
所有奇数位为1返回1。例子allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1.
思路:获取输入x值的奇数位,其他位清零(0xAAAAAAAA&x),然后与0xAAAAAAAA进行异或操作,若相同则最终结果为0,然后返回其值的逻辑非
1 | int allOddBits(int x) { |
5.negate
求-x不用-号。
1 | int negate(int x) { |
6.isAsciiDigit
判断输入的x是否满足0x30 <= x <= 0x39,满足返回1.
先判断0x30(!(x>>4^3)),再判断0x0——0x9(!(x>>3&1)|!(x>>1&1|x>>2&1))
1 | int isAsciiDigit(int x) { |
7.conditional
使用位级运算实现C语言中的 x?y:z
三目运算符
1 | int conditional(int x, int y, int z) { |
8.isLessOrEqual
使用位级运算符实现<=
1 | int isLessOrEqual(int x, int y) { |
9.logicalNeg
使用位级运算求逻辑非!
逻辑非就是非0为1,非非0为0。利用其补码(取反加一)的性质,除了0和最小数(符号位为1,其余为0),外其他数都是互为相反数关系(符号位取位或为1)。0和最小数的补码是本身,不过0的符号位与其补码符号位位或为0,最小数的为1
1 | int logicalNeg(int x) { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 pwnpwn小菜鸡!