算数移位,逻辑移位以及循环移位

目录

一.移位运算

1.算术移位

2.逻辑移位

二.循环移位


一.移位运算

当计算机中没有乘/除法运算电路时,可以通过加法和移位相结合的方法来实现乘/除法运算对于任意二进制整数,左移一位,若不产生溢出,相当于乘以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]。

算术移位逻辑移位循环移位是计算机中常用的位移操作。它们的区别在于对于移位后的空缺位的填充方式不同。 1. 算术移位算术移位是指在移位时,保留符号位,移位后空缺的位用符号位来填充。例如,对于二进制数1011,进行算术右移一位,得到1101,左移一位,得到0110。 2. 逻辑移位逻辑移位是指在移位时,空缺的位用0来填充。例如,对于二进制数1011,进行逻辑右移一位,得到0101,左移一位,得到1010。 3. 循环移位循环移位是指将二进制数的所有位进行循环移位,即移位后,最高位的数值会移动到最低位,其他位也按照相同的规则进行移位循环移位分为带进位和不带进位两种方式。带进位的循环移位是指在移位时,最高位的数值会移动到最低位,并且会影响到进位位,其他位也按照相同的规则进行移位。不带进位的循环移位是指在移位时,最高位的数值会移动到最低位,其他位也按照相同的规则进行移位,进位位不受影响。 下面是三种移位操作的示例: 1. 算术移位 ```python # 算术右移 a = 0b1011 b = a >> 1 print(bin(b)) # 输出:-0b101 # 算术左移 a = 0b1011 b = a << 1 print(bin(b)) # 输出:0b10110 ``` 2. 逻辑移位 ```python # 逻辑右移 a = 0b1011 b = a >> 1 print(bin(b)) # 输出:0b101 # 逻辑左移 a = 0b1011 b = a << 1 print(bin(b)) # 输出:0b10110 ``` 3. 循环移位 ```python # 带进位的循环右移 a = 0b1011 b = (a >> 1) | (a << (4 - 1)) print(bin(b)) # 输出:0b1101 # 不带进位的循环右移 a = 0b1011 b = (a >> 1) | (a << (4 - 1)) & 0b1111 print(bin(b)) # 输出:0b1101 # 带进位的循环左移 a = 0b1011 b = (a << 1) | (a >> (4 - 1)) print(bin(b)) # 输出:0b0111 # 不带进位的循环左移 a = 0b1011 b = (a << 1) | (a >> (4 - 1)) & 0b1111 print(bin(b)) # 输出:0b0111 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值