首页/计算机组成原理/02-data-representation/移位运算 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

移位运算

重要度 ⭐⭐⭐⭐逻辑移位算术移位循环移位桶形移位器
速查
逻辑移位:空位补 0(无符号数 ×2ⁿ/÷2ⁿ);算术移位:符号位不变,右移正补 0 负补 1(有符号数);循环移位:移出位从另一端移入(含 CF 的 RCL/RCR)。乘法可化为 移位 + 加法

基本概念

移位运算是计算机中最基本的运算之一,分为逻辑移位算术移位循环移位三类。

逻辑移位

逻辑移位将数据视为无符号数,空位补 0。

左移(Logic Left Shift, LSL)

  • 所有位左移,高位移出丢弃,低位补 0。
  • 效果:相当于乘以 $2^n$。

右移(Logic Right Shift, LSR)

  • 所有位右移,低位移出丢弃,高位补 0。
  • 效果:相当于无符号除以 $2^n$(向下取整)。

算术移位

算术移位将数据视为有符号数(补码),保持符号位不变。

算术左移(ASL)

  • 所有位左移,符号位不变,低位补 0。
  • 效果:乘以 2(可能溢出)。

算术右移(ASR)

  • 所有位右移,符号位保持不变,高位(含符号位)保持一致。
  • 正数高位补 0,负数高位补 1。
  • 效果:除以 2(向负无穷取整)。
注意算术右移向负无穷取整,而 C 语言整数除法向零取整:$-\frac{13}{2} = -6$(向零),但 $-13 >> 1 = -7$(向负无穷)。

循环移位

循环移位中移出的位从另一端移入,不会丢失。

  • 循环左移(ROL):最高位移到最低位,其余左移。
  • 循环右移(ROR):最低位移到最高位,其余右移。
  • 带进位的循环移位(RCL/RCR):进位标志 CF 参与循环。

手算示例

例 1:逻辑左移 2 位

原始:  0000_1101 (13)
左移2位:0011_0100 (52)
验证:13 × 4 = 52 ✓

例 2:逻辑右移 2 位

原始:  0011_0100 (52)
右移2位:0000_1101 (13)
验证:52 ÷ 4 = 13 ✓

例 3:算术左移(正数)

原始(补码):  0011_0100 (+52)
左移1位:     0110_1000 (+104)
验证:52 × 2 = 104 ✓

例 4:算术右移(负数)

原始(补码):  1111_0011 (-13)
右移1位:     1111_1001 (-7)  (向负无穷取整)
验证:-13 ÷ 2 = -6.5 → 向下取整 = -7 ✓

例 5:循环左移

8位寄存器:1011_0010
循环左移1位:0110_0101 (最高位1移到最低位)
循环左移2位:1100_1010

例 6:带进位循环右移

CF=0, 寄存器=1011_0010
RCR 1位后:CF=0, 寄存器=0101_1001
(最低位移入CF,CF旧值移入最高位)

移位运算的硬件实现

桶形移位器(Barrel Shifter)

  • 通过多级多路选择器实现。
  • n 位数据可以用 $\log_2 n$ 级实现任意移位。
  • 一次操作完成任意位数移位,无需多次循环。

移位运算在乘除法中的应用

乘法通过移位 + 加法实现:$A \times 13 = A \times (8+4+1) = (A<<3) + (A<<2) + A$。

常见考题类型

  1. 给出移位操作,求结果。
  2. 算术移位与逻辑移位的区别。
  3. 补码算术右移的结果判断。
  4. 用移位实现乘除法。

记忆卡片

逻辑移位和算术移位的区别?
逻辑移位针对无符号数(空位补 0);算术移位针对有符号数(保持符号不变)。记忆:逻辑 → 无脑补 0;算术 → 动脑看符号。
算术右移负数时高位补什么?
补 1(保持符号位一致)。记忆:负数算术右移 → 高位全填 1,保持"负的"。
算术右移与 C 语言整数除法结果相同吗?
不同!算术右移向负无穷取整,整数除法向零取整(-13>>1=-7 而 -13/2=-6)。
循环移位和普通移位的区别?
循环移位中移出的位从另一端移入,不会丢失。记忆:像环形队列,出来的进去。

交互动画 · 8 位寄存器移位

8 位寄存器(左 = bit7 最高位,右 = bit0),左侧 CF = 进位标志 CFb7b6b5b4b3b2b1b0 0 10110010 移出:— 移入:—
按不同移位类型操作寄存器,红色 = 移出位,橙色 = 移入位
点击按钮开始

相关知识点

twos-complement-arithmetic fixed-and-floating-point

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。