移位运算是计算机三大基本运算之一,基本运算包括按位运算、逻辑运算和移位运算。
基本运算的特点:
(1)仅对寄存器中的数据进行运算。
(2)计算机中最基本的操作单元,在一个时钟周期内完成。
(3)需要控制信号。
区分算术移位和逻辑移位
从运算符本身是区分不了算术移位还是逻辑移位,因为它们的运算符号都是<<,>>
,实际上取决于操作数的类型。如果操作数是无符号数即是逻辑移位,如果操作数是带符号数,是算术移位。
1.逻辑移位
操作对象: 二进制无符号数,例如像地址。
(1)逻辑右移
特点:高位补0,低位移出。
(2)逻辑左移
特点:低位补0,高位移出。
问题探究:什么时候会发生溢出?如何判断溢出?
如果高位移出的是一,则左移发生溢出。
2.算术移位
操作对象: 二进制有符号数,现代计算机中有符号数字使用补码表示。由于计算机不能识别正负号,而0和1恰好可以表示这两种状态。这样就将符号数字化了。
问题探究:什么时候会发生溢出?如何判断溢出?
算术左移溢出判断:如果移出的位不等于新的符号位,则溢出。
算术右移不会发生溢出,但是如果移出的低位不为0,则可能发生数据丢失的的情况。
(1)算术左移
算术左移:按指定的位数向左移位,C语言中用符号 “<<” 表示。
移出的位放在一个特殊的寄存器中,低位补0。
算术左移可以实现的功能: 左移n位实现乘以2^n的功能。
(2)算术右移
算术右移:按指定的位数向右移位,C语言中用符号 “>>” 表示。
算术右移可以实现的功能: 右移n位实现乘以2^(-n)的功能。