Python中如何对二进制数左右移位且不丢失被移出的位
固定位宽二进制循环移位实现方案
你要实现的是固定位宽下的循环移位(又称旋转移位),和Python默认的逻辑移位不同,循环移位会将移出的位拼到数值的另一端,且始终保持指定的位宽,刚好可以满足你不丢失移出位的需求。
以你使用的16位二进制为例,循环左移的实现逻辑如下:
- 先对数值做普通左移得到高位部分
- 把原数右移
位宽-移位位数位,取出原本会被移出的高位 - 将两部分做或运算拼接,最后用位掩码保留指定长度的结果即可
代码实现示例
# 指定位宽为16位 BIT_WIDTH = 16 example = 0b1010001110011011 shift = 6 # 16位循环左移实现 rol_result = ((example << shift) | (example >> (BIT_WIDTH - shift))) & ((1 << BIT_WIDTH) - 1) print(bin(rol_result)) # 输出结果为 0b1110011011101000,和你的预期完全一致
如果需要实现循环右移,只需调整移位顺序即可:
# 16位循环右移shift位实现 ror_result = ((example >> shift) | (example << (BIT_WIDTH - shift))) & ((1 << BIT_WIDTH) - 1)
如果需要适配其他位宽,只需修改BIT_WIDTH的取值即可,比如要做32位循环移位就将其赋值为32。
内容的提问来源于stack exchange,提问作者kevinjack
相关产品推荐
相关产品推荐

