文章背景
谷歌搜索"循环移位"以及"逻辑移位和算术移位"这两个关键字得到的前三篇文章实在是纰漏过多
于是笔者改为搜索"arithmetic shift and logical shift stackoverflow",得到的前三篇文章完美解决了笔者的所有问题,故记录如下
题主水平有限,如有纰漏,请斧正,我会第一时间修改(本账号长期更新)
本文受众
- 对位运算已有基础的了解,苦于位运算进阶的读者
- 尤其是位运算逆向方面
- 对循环位移及循环位移的变式题型较为不解的读者
正文
循环位移
先看下方原理图
可以看到,经过循环左移的高位数据不会被丢弃,而是会被补充至数据低位;
同样的,经过循环右移的低位数据不会被丢弃,而是会补充至数据的高位。
对于左移而言,使用或运算将原本应当被舍弃的数据,填补在原本应当补0的低位上
对于右移而言,使用或运算将原本应当被舍弃的数据,填补在原本应当补符号位的高位上
以下示例以循环左移为主
Talk is cheap,show me the codes.
类C语言的循环位移
类C语言的数据宽度可以人为控制,因此较容易实现循环位移
请看下方的实现代码(C++环境下)
#include<iostream>
using namespace std;
int main() {
cout << "this is Lsh program";
unsigned