实验要求
使用位操作! ~ & ^ | + << >>来完成对应的函数,具体的要求参考datalab.pdf以及bits.c中开头部分的说明,测试和运行的方式参考datalab.pdf。
实验中的数字均为32bit大小。具体的实现和思路
bitAnd(int x, int y) x与y的按位与
使用~和|实现按位与&,最大的操作次数为8。
我们都知道有公式,!(x && y) = !x || !y那么可以得到(x && y) = !(!x || !y)
位运算也是同理,即return =~((~x)|(~y));getByte(int x, int n) 获得整型x的第n个字节(n为0-3,分别代表低位和高位)
获得第n个字节,只需要将对应的x右移n*8位,然后通过按位与255即可获得最低的8位,而n*8可以用n<<3来表示
即代码为return (x >> (n << 3)) & 255logicalShift(int x, int n) 将x逻辑右移n位
c语言中的右移操作符>>为算数右移,即符号位填充高位。为逻辑右移为0填充高位,因此直接使用x >> n的话如果x为负数则结果不正确。
对于负数来说,算数右移n位后前面会有n个1,因此只需要按位与前n位为0,后面的32-n为1就能去除原先前面的n个1,并能使后面的结果保持不变。
需要注意的是,如果直接使用(1 << (32 - n)) - 1的话,当n为0时可能会错误。
此处需要在整型最大值的基础上右移得到,即首先通过~(1 << 31)得到IMAX,然后向右移动n-1位即可得到前面n个0,而如果n为0为-1,此处采用右移n,左移1位。此外,此时左移1位后末尾为0,因此要加上1。int shift = ~(1 << 31); shift = ((shift >> n) << 1) + 1; return (x >> n) & shift;bang(int x) 计算!x
根据讲义的ppt,(x | -x) >> 31 == -1只有在x为0时不成立,因此非0时输出的为32bit的全1,0时输出的是32bit的全0,因此针对上述表
CSAPP lab1 位操作
最新推荐文章于 2024-06-09 22:54:20 发布
本文详细介绍了完成CSAPP实验室位操作任务的过程,包括位与、获取字节、逻辑右移、非运算、整型最小值计算、位数适应性检查、除以2^n、求相反数、正数判断、小于等于比较以及浮点数的位操作。每个操作都给出了具体的实现思路和代码示例。

最低0.47元/天 解锁文章
8419

被折叠的 条评论
为什么被折叠?



