C++程序 旋转数字的位数
位旋转:旋转(或循环移位)是一种类似于移位的操作,但掉落的位在一端重新放回另一端。
在左旋转中,落在左端的位转到右端。
在右旋转中,落在右端的位转到左端。
例子:
假设 n 存储了 8 位。向左旋转3个单位 n = 11100101,得到 n = 00101111(左移3个单位并把前3个放回最后)。如果 n 存储了16位或32位,则 n 的左旋转(000…11100101)变成00..00 11100101 000。
向右旋转3个单位 n = 11100101,得到 n = 10111100(右移3个单位并把后3个放回最前),如果 n 存储了8位,则 n 的左旋转(000…11100101)变成 101 000..00 11100 。
// C++代码,旋转数字的位数
#include <bits/stdc++.h>
using namespace std;
#define INT_BITS 32 //定义整数最大位数
class gfg {
/*函数,向左旋转 n 的 d 位*/
public:
int leftRotate(int n, unsigned int d)
{
/* 在 n<<d 中,最后d位是0,为了把n的第3位放到最后,
需要将 n<<d 与 n >>(INT_BITS - d) 按位或运算 */
return (n << d) | (n >> (INT_BITS - d));
}
/*函数,向右旋转 n 的 d 位*/
int rightRotate(int n, unsigned int d)
{
/* 在 n>>d 中,前 d 位为 0。为了把 n 的最后3位放到最前,
需要将 n >>d 与 n <<(INT_BITS - d) 按位或运算 */
return (n >> d) | (n << (INT_BITS - d));
}
};
/* 主函数 */
int main()
{
gfg g;
int n = 16;
int d = 2;
cout << "Left Rotation of " << n << " by " << d
<< " is ";
cout << g.leftRotate(n, d);
cout << "\nRight Rotation of " << n << " by " << d
<< " is ";
cout << g.rightRotate(n, d);
}
// 代码作者:SoM15242```
输出
Left Rotation of 16 by 2 is 64
Right Rotation of 16 by 2 is 4
时间复杂度: O(1)
辅助空间: O(1)