实列二十九:移位运算

实例二十九:移位运算

问题描述:
编写一个程序,其功能是:从键盘输入一个无符号整数 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值