CSAPP_datalab 笔记

记录自己在做lab时的思考过程

默认前提

  • x 为 32位有符号数(int)
  • 右移默认为算术右移

通过位运算获得特殊数

x 条件 运算 结果
x!=0 !x 0
x=0 !x 1
x<0 x>>31 -1
x>0 x>>31 0
x=1 1<<31 Tmin
x!=Tmin ~x+1 -x

通过位运算实现逻辑控制

与异或运算相关

  • x ^ -1(111..11b) 等同于 ~x
  • x ^ 0(000..00b) 等同于 x(不变)
  • x ^ (x >> 31)
    • x非负则保持不变
    • x为负则按位取反

设计掩码

  • 要生成从第x位到x+b位的1掩码
    • 111..1 << x(b位1)

通过!和&实现选择逻辑

  • 实现 if x == 1, return y else z
    • y, z均为1位二进制数
    • (x & y) + (!x & z)
  • 实现 if x is true, return y else z
    • y, z均为任意二进制

    • flag!x, x为零时为一, 不为零时为零

    • -1=111...1b实际上为全一掩码, 0为全零掩码

      flag flag - 1 ~flag + 1
      0 11111111(b) 00000000(b)
      1 00000000(b) 11111111(b)
    • (flag - 1) & y + (~flag + 1) & z

补码的溢出性质

  • Tmax-1都满足(x+1) << 1 == 0
    • 01...11 -> 10..00-> 00..00
    • 11...11 -> 00..00-> 00..00
  • 0Tmin都满足~x + 1 == x
    • 00...00 -> 11...11->00..00
    • 10...00 -> 01...11->10..00
posted @ 2020-11-28 19:07  Muxv  阅读(84)  评论(0)    收藏  举报