一直对位运算感觉很是不解,最新重新学习了一下,做了个整理。
刚开始学,我也有太多的疑惑。首先,我们都知道在计算机中,数据都是以二进制进行存储和运算。但是在计算机中数据二进制的运算是以怎样的形式进行的呢?因为数有正数和负数,二进制是如何表示和区分分正数和负数的呢?目前计算机中使用的运算方法普遍是二进制补码的方式进行的,这又是为什么呢。
以下,我们用八位二进制位来表示一个数。比如十进制的10,二进制表示为0000 1010。
- 原码
- 为了区分数的正负,我们可以将它的最高位作为符号位,0代表正,1代表负数
-
以上这种表示称为数的原码
- 如果我们直接对原码进行相加得到什么样的结果呢。按照我们的本意10-10=0,但是实际上呢?10与-10的二进制码相加为1001 0100,转为十进制为-24,显然不为0。也就是说使用原码直接进行运算是不可以的。
- 补码
- 我们希望可以使用一种方式,使得 原码+?码 = 0,由此我们得到了补码。
- 首先我们需要补充的是上述是对负数而言的,对正数来说,原码,反码和补码是相同的。也就是如果二进制最高符号位是0的话,你就不需要去纠结想其他。
- 回归到负数上。负数的原码即有符号位的二进制表示。反码:原码符号位不变,其余按位取反。补码:原码符号位不变,其余按位取反后加1.即(反码+1)
-
以下我们可以看出使用补码运算可以完美解决有符号位问题,这也就是计算机使用二进制补码运算的原因。