乐趣区

关于计算机:移位运算

移位运算分为算术移位、逻辑移位、循环移位

算术移位

在算术移位中,通过扭转数码位和小数点的绝对地位,从而实现各个数码位的位权。

在各机器码的移位中,左移相当于 ×2,右移相当于 ÷2,但因为位数无限,会造成溢出,就无奈准确的等效乘除法。

原码的算术移位

原码的算术移位,符号位不参加移位,因为小数点是绝对固定的,所以将数码位进行左右挪动

  • 左移,高位舍弃,低位补 0

    • 如果舍弃的是 1,会呈现重大误差
    • 如果舍弃的是 0,相当于 ×2
  • 右移,低位舍弃,高位补 0

    • 如果舍弃的是 1,会呈现精度问题
    • 如果舍弃的是 0,相当于 ÷2

例:

舍弃的是 0

  • 00101010 对应十进制为 42

    • 左移一位 01010100 对应十进制为 84
    • 右移一位 00010101 对应十进制为 21

舍弃的是 1

  • 01010101 对应十进制为 85

    • 左移一位 00101010 对应十进制为 42

      • 如果机器位数够,不必舍弃,咱们来看下它移位后的值 010101010 对应十进制为 170
      • 17042 两个值的误差太大了
    • 右移一位 00101010 对应十进制为 42

      • 不必舍弃,看下移位后的值 00101010.1 对应十进制为 42.5
      • 42.542 两个值只是精度误差

反码的算术移位

反码的算术移位

  • 负数的反码算术移位和原码一样
  • 正数的反码算术移位

    • 左移,高位舍弃,低位补 1
    • 右移,低位舍弃,高位补 1

例:

  • 负数原码 00101010 对应十进制为 42

    • 反码 00101010

      • 左移一位 01010100
      • 右移一位 00010101
  • 正数原码 10101010 对应十进制为 -42

    • 反码 11010101

      • 左移一位 10101011
      • 右移一位 11101010

为啥正数的反码在移位时是补 1 呢?

因为正数的反码是在原码的根底上取反,所以为了保障数值上的对立,原码移位时是补 0,那反码就补 1

补码的算术移位

补码的算术移位

  • 负数的补码算术移位和原码雷同
  • 正数的补码算术右移

    • 正数补码左移(同原码):低位补 0,高位舍弃
    • 正数补码右移(同反码):高位补 1,低位舍弃

例:

  • 负数原码 00101010,对应十进制为 42

    • 补码 00101010

      • 左移一位:01010100
      • 右移一位:00010101
  • 正数原码 10101010,对应十进制为 -42

    • 补码 11010100

      • 左移一位:10101000
      • 右移一位:11101010

为啥正数补码移位会分状况呢?

能够从正数原码、反码、补码他们之间找法则,比方 -42

  • 原码:10101010
  • 反码:11010101
  • 补码:11010110

从左边开始数到第一个 1 的中央,1(包含 1)的左边同原码一样,右边同反码一样

  • 左移,左边同原码一样,在左边 (低位) 补 0
  • 右移,右边同反码一样,在右边 (高位) 补 1

总结

码制 补代码
负数 原码、反码、补码 0
正数 原码 0
正数 反码 1
正数 补码 左移补 0
正数 补码 右移补 1
退出移动版