0%

原码反码补码以及位运算

原码、反码、补码

无符号用原码

计算机的运算都用的补码

正数

  1. 原码, 反码,补码都相同

负数

  1. 反码等于原码符号位不变,其他取反。
  2. 补码等于反码+1

例子

  1. 2的原码为0000 0010, 因为是正数,所以反码、补码都相同为0000 0010。

  2. -2的原码为1000 0010, 最高位1为符号位,1表示负数,0表示正数。所以其反码为1111 1101, 补码为反码+1, 则为1111 1110。

位运算

  1. 位运算使用的都是反码。
  2. 位运算如果存在负数,最后都需要还原为原码得到真值。

异或

-2和2做异或

-2补码为1111 1110,2补码为0000 0010, 两者异或得到1111 1100。

因为存在-2,负数,所以需要对结果-1,**然后除了符号位进行取反操作,得到真正的值(原码)**,即对1111 1100减1,得到1111 1011,然后除去符号位取反,得到1000 0100,该值为-4。

位移运算

  1. 右移运算,>> 低位溢出,符号位不变,并用符号位(正数0补,负数1补)补溢出的高位
  2. 左移运算,<< 符号位不变,不够部分用0来补
  3. 位移运算如果存在负数,最后都需要还原为原码得到真值。
1
1>>2

1的补码为0000 0001, 右移2位,符号位不变,得到0000 0000即为0

1
1<<2

左移两位,符号位不变,不够的部分0补,得到0000 0100即为4

1
-2>>2

-2的补码为1111 1110,右移2位,符号不变,高位溢出,用符号位1来补,得到1111 1111,然后-1,除去符号位取反还原回原码,1000 0001即为-1.

1
-2<<2

-2的补码为1111 1110,右移2位,符号不变,不够部分用0补,得到1111 1000,然后-1,除去符号位取反得到原码为1000 1000,即为-8。

有些东西迟早还是要还的。。。

坚持原创技术分享,您的支持将鼓励我继续创作!