实例二十九:移位运算
问题描述:
编写一个程序,其功能是:从键盘输入一个无符号整数 m 以及位移位数 n ,当 n>0 时,将 m 循环右移 n 位;当 n<0 时,将 m 循环左移 |n| 位。
算法思路:
- 用 sizeof() 函数确定一个无符号整数所占据的二进制位数 k 。
- 如果是循环右移,则先将 m 右移 n 位(即将原数的高 k - n 位移到低位),再将 m 左移 k - m 位(即将原数的低 n 位移到高位),然后将它们作按位或运算(即将它们合并)。
- 如果是循环左移,则将 m 左移 n 位(即将原数的低 k - n 位移到高位),再将 m 右移 k - n 位(即将原数的高 n 位移到低位),然后将它们作按位或运算。(即将他们合并)。
#include <stdio.h>
int moveright(unsigned m,int n)
{
unsigned z;
int k;
k = 8 * sizeof(unsigned);
z = (m>>n)|(m<<(k-n));
return (unsigned)z;
}
int moveleft(unsigned m,int n)
{
unsigned z;
int k;
k = 8 * sizeof(unsigned);
z = (m<<n)|(m>>(k-n));
return z;
}
int main(void)
{
unsigned m;
int n;
printf("Input m and n:");
scanf("%x,%d",&m,&n);
if(n>0)
printf("moveright=%x\n",moveright(m,n));
else
printf("moveleft=%x\n",moveleft(m,-n));
return 0;
}