CSAPP lab1 位操作

实验要求 使用位操作! ~ & ^ | + << >>来完成对应的函数,具体的要求参考datalab.pdf以及bits.c中开头部分的说明,测试和运行的方式参考datalab.pdf。 实验中的数字均为32bit大小。具体的实现和思路bitAnd(int x, int y) x与y的按位与 使用~和|实现按位与&,最大的操作次数为8。 我们都知道有公式,!(x && y) = !x ||
摘要由CSDN通过智能技术生成
  1. 实验要求
    使用位操作! ~ & ^ | + << >>来完成对应的函数,具体的要求参考datalab.pdf以及bits.c中开头部分的说明,测试和运行的方式参考datalab.pdf。
    实验中的数字均为32bit大小。

  2. 具体的实现和思路

    • 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时不成立,

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值