目录
一.移位运算
当计算机中没有乘/除法运算电路时,可以通过加法和移位相结合的方法来实现乘/除法运算对于任意二进制整数,左移一位,若不产生溢出,相当于乘以2(与十进制数的左移一位相当于乘以 10 类似);右移一位,若不考虑因移出而舍去的末位尾数,相当于除以2。
根据操作数的类型不同,移位运算可以分为算术移位和逻辑移位:
1.算术移位
算术移位需要考虑符号位的问题,即将操作数视为有符号整数。计算机中的有符号整数都是用补码表示的,因此对于有符号整数的移位操作应采用补码算术移位方式。
算术移位的规则:① 左移时,高位移出,低位补0,若移出的高位不同于移位后的符号位,即左移前后的符号位不同,则发生溢出;② 右移时,低位移出,高位补符号位,若低位的1移出,则影响精度。例如,补码1001和0101左移时会发生溢出,右移时会丢失精度。
2.逻辑移位
右移:高位补0,低位舍弃。
左移:低位补0,高位舍弃。
逻辑移位将操作数视为无符号整数。对于无符号整数的逻辑左移,若高位的1移出,则发生溢出。
逻辑移位的例子:获取RGB值的过程
R=102 (01100110)
G=139 (10001011)
B=139 (10001011)
二.循环移位
循环左移后移出的数会被补到最右边
右移同理,循环右移后,右边移出的数会被补到最左边
带进位位的循环移位:
循环左移会将原本数值的最高位,移动到进位位CF,并且将原本CF的值,补到最右边
循环右移同理,将数值位的最低位放到CF中,CF的值放到数值位的最高位中
循环移位一般用在大端存储和小端存储转换中,大端存储和小端存储的含义如下:
大端是高字节存放到内存的低地址
小端是高字节存放到内存的高地址
以32位int型数0x12345678举例:
循环移位对于16位bit(2个字节)数的大端小端转换中比较有用,直接向左移动8位bit或向右移动8bit即可。
而对于32位bit可以进行如下处理:
1.将整数表示为4个字节,即[0x12, 0x34, 0x56, 0x78]。
2.将这4个字节的位置进行互换,即将第一个字节和最后一个字节交换,将第二个字节和倒数第二个字节交换。
3.调换后的结果为[0x78, 0x56, 0x34, 0x12]。