Menu
CoddyTech

数字的位旋转 II

Coddy 位运算 课程的第 13 课,共 17 课。

好了!你已经理解了旋转的含义。在这种情况下,我们也可以通过移位操作来理解旋转。我们还可以说,旋转二进制数就像对它执行移位操作,只不过我们不会丢弃移出的位,而是把它们放回这个数中。通过一个例子来了解一下:

假设在一台 8 位计算机中有 (33)10 。如果我们将它向左旋转 3 次,它会存储为 (00100001)2, 。

  •  首先,我们将 (33)10 左移 3 次。
  • 为了保存移出的位,我们再将它右移 8-3 次。(8 是计算机用于在内存中存储这个数的位数。)
  • 然后,我们对 x 和 y 执行 OR 运算,得到旋转后的数。
x = 33<<300001000
y = 33>>500000001

x | y

00001001

同样,我们也可以进行向右旋转:

  • 首先,我们将 (33)10 向右移 3 次,并将这个值保存在一个变量中。
  • 然后,将它左移 (8-3) 次,并将这个值保存在另一个变量中。
  • 接着,通过执行 OR 运算,我们就能得到旋转后的数。
x = 33 >> 300000100
y = 33 << 500100000

x | y

00100100

就是这样!借助位操作,我们可以轻松地旋转二进制数的各个位。

challenge icon

挑战

中等

请补全函数 SumLeftRightRotation(),返回给定数字左旋和右旋后的值之和。 

例如,数字 20 左旋后返回 40,右旋后返回 10,因此输出为 50,也就是左旋和右旋后的值之和。 

这里,num 表示数字,r 表示旋转次数。

亲手试试

#define INT_BITS 32
using namespace std;

int SumLeftRightRotation(int num, int r) {
    // 在这里编写代码
}

位运算中的所有课

自己练习: C++ 在线编译器

检查进制转换: 进制转换器