Skip to main content

第5章 原码反码补码和位运算

信息编码

机器数与真值

一个数在计算机中的二进制表示形式,被称为这个数的 机器数

将带符号位的机器数对应的真正数值称为机器数的 真值

为了区分正负数,机器数的最高位被用于存储符号,被称为 符号位

  • 正数:符号位为 0
  • 负数:符号位为 1

如果计算机字长为 8 位:

+1 的机器数:00000001
机器数 00000001 的真值:+1

-1 的机器数:10000001
机器数 10000001 的真值:-1

教材提出问题:

如果电脑直接使用机器数进行运算,(+1) + (-1) 等于多少?

这也是引入反码和补码表示的重要背景。

原码

原码就是该数值的机器数,即:

  • 最高位为符号位
  • 其余位表示数值

这是人脑最容易理解和计算的表示方式。

例如:

[+1]原 = 00000001
[-1]原 = 10000001

在考虑符号位的前提下,8 位二进制原码的取值范围为:

[-127, 127]

反码

反码的表示方法:

  • 正数的反码是其本身
  • 负数的反码:在原码基础上,符号位不变,其余各位取反

例如:

[+1]原 = 00000001
[+1]反 = 00000001

[-1]原 = 10000001
[-1]反 = 11111110

补码

补码的表示方法:

  • 正数的补码就是其本身
  • 负数的补码:在反码基础上 +1

例如:

[+1]原 = 00000001
[+1]反 = 00000001
[+1]补 = 00000001

[-1]原 = 10000001
[-1]反 = 11111110
[-1]补 = 11111111

教材还列出特殊情况:

00000000 代表 0 的原码、反码和补码

10000000 代表 -128

教材描述:

-128 的反码:11111111
-128 的补码:10000000

补码运算示例

教材示例:使用补码计算 (+2) + (-2)

2 - 2 = 2 + (-2)

0000 0010 原
1000 0010 原

0000 0010 反
1111 1101 反

0000 0010 补
1111 1110 补
----------------
1 0000 0000

最高位产生的进位舍弃:

0000 0000 补
0000 0000 反
0000 0000 原
= 0
教材总结

在计算机中,所有的数均以 补码形式存在。

补码可以简化运算,把减法转换为加法。

正数:

原码 = 反码 = 补码
原码及补码
图5-1 原码及补码

练习 1

1. 求 +119 的原码、反码和补码。

查看答案
原码:01110111
反码:01110111
补码:01110111

2. 求 -56 的原码、反码和补码。

查看答案
原码:10111000
反码:11000111
补码:11001000

3. 在 8 位二进制补码中,10101011 表示的数是十进制下的( )。

  • A. 43
  • B. -85
  • C. -43
  • D. -84
查看答案

答案:B

什么是位运算?

现代计算机中的数据都是以二进制形式存储的,每一位都可以存储 01 两种状态。

计算机对每一位进行的运算称为 位运算,教材强调符号位也共同参与运算。

位移运算和位运算
图5-2 位移运算和位运算

位逻辑运算符

位逻辑运算是将每个二进制位作为布尔值进行布尔运算,以逻辑中的真和假(10)作为运算单元,结果也为 10

注意

教材强调:

  • 位运算是针对二进制位的运算
  • 计算机中的数以补码形式存在
  • 手工计算位运算时,需要先把数转换成二进制补码
  • 各数右对齐后,逐位进行运算

按位与 &

运算规则:

两个位都为 1 时,结果才为 1

真值表:

ABA & B
000
010
100
111

运算方式:

  1. 将数字转换成补码
  2. 逐位进行与运算
  3. 得到结果后再转换成原码,或转换为对应的十进制数

教材示例:

3 & 5 = 1

3 = 0000 0011
5 = 0000 0101

0000 0011
& 0000 0101
--------------
0000 0001
位与运算示例
图5-3 位与运算示例

教材还给出了负数参与按位与的示例:

-3 & -5 = -7
位与运算示例(负数)
图5-4 位与运算示例(负数)

练习 2

  1. 表达式 0x13 & 0x17 的值是 _________。

    答案:19

  2. x = -2y = 3,则 x & y 的结果是 _________。

    答案:2

  3. x = -2y = -3,则 x & y 的结果是 _________。

    答案:-4

按位或 |

运算规则:

两个位只要有一个为 1,结果就为 1

真值表:

ABA | B
000
011
101
111

运算方式:

  1. 将数字转换成补码
  2. 逐位进行或运算
  3. 得到结果后再转换成原码,或转换为对应的十进制数
位或运算示例(正数)
图5-5 位或运算示例(正数)
位或运算示例(正负数)
图5-6 位或运算示例(正负数)
位或运算示例(负负数)
图5-7 位或运算示例(负负数)

教材示例:

3 | 5 = 7

教材还给出了负数参与按位或的示例:

-3 | 5 = -3
-3 | -5 = -1

练习 3

  1. 表达式 0x13 | 0x17 的值是 _________。

    答案:23

  2. x = -2y = 3,则 x | y 的结果是 _________。

    答案:-1

  3. x = -2y = -3,则 x | y 的结果是 _________。

    答案:-1

按位异或 ^

运算规则:

两个位不同为 1,相同为 0

真值表:

ABA ^ B
000
011
101
110

运算方式:

  1. 将数字转换成补码
  2. 逐位进行异或运算
  3. 得到结果后再转换成原码,或转换成对应的十进制数

教材示例:

3 ^ 5 = 6
-3 ^ 5 = -8
-3 ^ -5 = 6
按位异或运算示例(正正数)
图5-8 按位异或运算示例(正正数)
按位异或运算示例(正负数)
图5-9 按位异或运算示例(正负数)
按位异或运算示例(负负数)
图5-10 按位异或运算示例(负负数)

练习 4

  1. 表达式 0x13 ^ 0x17 的值是 _________。

    答案:4

  2. x = -2y = 3,则 x ^ y 的结果是 _________。

    答案:-3

  3. x = -2y = -3,则 x ^ y 的结果是 _________。

    答案:3

按位取反 ~

运算规则:

0110

运算方式:

  1. 将数字转换成补码
  2. 对每一位进行取反
  3. 得到结果后再转换成原码,或转换为对应的十进制数

教材示例:

~3 = -4
~(-3) = 2
按位取反运算示例(负负数)
图5-11 按位取反运算示例(负负数)

练习 5

  1. 表达式 ~0x17 的值是 _________。

    答案:-24

  2. 表达式 ~-3 的值是 _________。

    答案:2

位移运算符

位移运算是将一个运算对象的各位数字全部向左或向右移动若干位。

教材总结:

  • 左移 <<:向左移动 X 位,数值大小扩大为原来的 2X
  • 右移 >>:向右移动 X 位,数值大小缩小为原来的 2X

左移 <<

运算规则:

向左移动 X 位,数值大小扩大为原来的 2X 倍。

运算方式:

在不考虑溢出的情况下,将除符号位之外的数字整体向左移动,低位(右侧空位)补 0

快速运算:

a << X

可按教材理解为:

a × 2^X

教材示例:

3 << 2 = 12
-3 << 2 = -12
左移示例
图5-12 左移示例
右移示例
图5-13 右移示例

右移 >>

运算规则:

向右移动 X 位,数值大小缩小为原来的 2X 倍。

运算方式:

教材表述为:

  1. 将数字转换成补码
  2. 所有数字整体向右移动
  3. 高位(左侧空位)补符号位数字

快速运算:

教材按“直接除以 2X,向下取整”理解。

例如:

35 >> 2 = 8
-35 >> 2 = -9

教材特别提示负数向下取整,例如:

⌊-35.0 / 4⌋ = -9

练习 6

  1. 表达式 0x17 << 2 的值是 _________。

    答案:92

  2. 表达式 -0x17 >> 2 的值是 _________。

    答案:-6