https://blog.csdn.net/LiuBo_01/article/details/80149708
循环移位就是把数值变成二进制,然后循环移动的过程;换句话说,循环移位就是将移出的低位放到该数的高位(循环右移)或把移出的高位放到该数的低位(循环左移),左移,和右移动都是对整数进行的操作,在Win32控制台应用程序中,整形占4Byte节32bit。
循环左移的过程:
循环左移的过程可以分为3步:
1. 将x左端的n位先移动到y的低n位中,x>>(32-n);
2. 将x左移n位,其右面低位补0,x<<n;
3. 进行按位或运算(x >> (32 - n) | (x << n));
循环右移的过程:
循环右移的过程可以分为3步:
1. 将x的左端的低n位先移动到y的高n位中x<<(32-n)
2. 将x右移n位,其左面高n位补0x>>n;
3.进行按位或操作(x << (32 - n) | (x >> n));
假如将一个无符号的数据val,长度为N,需要循环移动n位。可以利用下面的公式:
循环左移:(val >> (N - n) | (val << n))
循环右移:(val << (32 - n) | (val >> n))
C语言实现循环移位:循环移位是对二进制序列进行操作,所以实现循环移位先需要将需要移位的数转换为二进制序列,然后按照上面描述的步骤进行移位,最后将移位后的二进制序列打印出来;
源代码
#include <stdio.h>
#include <Windows.h>
//将一个十进制数转换为二进制
void trans_binary(unsigned int val)
{
int a[32];
int i = 0;
for(i=0;i<=31;i++)
{
a[i] = val % 2;
val /= 2;
}
//倒序输出,每输出8位,输出一个空格
for (int j = 31,k = 1; j >= 0; j--,k++)
{
printf("%d", a[j]);
if (k % 8 == 0)
{
printf(" ");
}
}
printf("\n");
}
//循环左移
void left_move(unsigned val, int n)
{
unsigned int z;
printf("需要移位的二进制序列为:\n");
trans_binary(val);
z = (val >> (32 - n) | (val << n));
printf("移位后:\n");
trans_binary(z);
}
void right_move(unsigned val, int n)
{
unsigned int z;
printf("需要移位的二进制序列为:\n");
trans_binary(val);
z = (val << (32 - n) | (val >> n));
printf("移位后:\n");
trans_binary(z);
}
int main()
{
int num = 0;
int n = 0;
int select = 0;
printf("请输入要移位的数和移动位数:\n");
scanf("%d%d", &num, &n);
printf("请输入选择:(-1-:左移 -2-:右移 -0-:退出):\n");
scanf("%d", &select);
switch (select)
{
case 1:left_move(num, n);
printf("\n");
break;
case 2:right_move(num, n);
break;
case 0:exit(0);
break;
default:
printf("输入有误!\n");
break;
}
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
运行结果
为了更直观的显示结果,选取了一个比较大的数1234567891,移动位数:8,移动方式:循环左移;根据循环左移的方法,先取出高8(移动的位数)位,移动到底8位(右移24位),然后将其余位数依此左移8位,结果与运行结果一致。