数字的位旋转 II
Coddy 位运算 课程的第 13 课,共 17 课。
好了!你已经理解了旋转的含义。在这种情况下,我们也可以通过移位操作来理解旋转。我们还可以说,旋转二进制数就像对它执行移位操作,只不过我们不会丢弃移出的位,而是把它们放回这个数中。通过一个例子来了解一下:
假设在一台 8 位计算机中有 (33)10 。如果我们将它向左旋转 3 次,它会存储为 (00100001)2, 。
- 首先,我们将 (33)10 左移 3 次。
- 为了保存移出的位,我们再将它右移 8-3 次。(8 是计算机用于在内存中存储这个数的位数。)
- 然后,我们对 x 和 y 执行 OR 运算,得到旋转后的数。
| x = 33<<3 | 00001000 |
| y = 33>>5 | 00000001 |
x | y | 00001001 |
同样,我们也可以进行向右旋转:
- 首先,我们将 (33)10 向右移 3 次,并将这个值保存在一个变量中。
- 然后,将它左移 (8-3) 次,并将这个值保存在另一个变量中。
- 接着,通过执行 OR 运算,我们就能得到旋转后的数。
| x = 33 >> 3 | 00000100 |
| y = 33 << 5 | 00100000 |
x | y | 00100100 |
就是这样!借助位操作,我们可以轻松地旋转二进制数的各个位。
挑战
中等请补全函数 SumLeftRightRotation(),返回给定数字左旋和右旋后的值之和。
例如,数字 20 左旋后返回 40,右旋后返回 10,因此输出为 50,也就是左旋和右旋后的值之和。
这里,num 表示数字,r 表示旋转次数。
亲手试试
#define INT_BITS 32
using namespace std;
int SumLeftRightRotation(int num, int r) {
// 在这里编写代码
}位运算中的所有课
自己练习: C++ 在线编译器
检查进制转换: 进制转换器