实验要求
使用位操作! ~ & ^ | + << >>
来完成对应的函数,具体的要求参考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)) & 255
logicalShift(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时不成立,
CSAPP lab1 位操作
最新推荐文章于 2024-06-09 22:54:20 发布