C语言循环移位及位操作

原文作者xiaoxiaopig

原文链接http://bbs.ednchina.com/BLOG_ARTICLE_280955.HTM

C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位
设一个操作数x有s位则循环左移n位的操作为:
(x << n) | (x >> (s - n));
同理右移n位位:
(x >> n) | (x << (s - n));
实际编程中可以用宏定义实现循环移位:
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))

例如:

#include <stdio.h>
#define ROTATE_LEFT(x, s, n) ((x) << (n)) | ((x) >> ((s) - (n)))
#define ROTATE_RIGHT(x, s, n) ((x) >> (n)) | ((x) << ((s) - (n)))
int main()
{
    unsigned int a;
    scanf("%x", &a);
    printf("%08x\n", a);
    printf("%08x\n", ROTATE_LEFT(a, 8 * sizeof(int), 4));
    printf("%08x\n", ROTATE_RIGHT(a, 8 * sizeof(int), 8));
    return 0;
}


运行结果:


12345678  //原数


23456781 //移1位后


具体样例:


设有数据  a=01111011,循环左移2位 正确结果: 11101101


 分步实现:


   b=a>>(8-2) ;//用来得到正常左移丢失的位和循环移位后其正确位置     b="00000001";


    a="a"<<2;//左移 a="11101100"


    a=a|b; //a=11101101


 如果不是用中间变量一步实现: a=(a>>(8-2))|(a<<2);


 总长度N(8 16 32)


 循环左移n (a>>(N-n))|(a>>n)


 循环右移n (a<<(N-n))|(a>>n)


 C语言的位运算功能是其区别于其他大多数高级程序设计语言的特色之一,用它可以方便实现一些特殊功能,灵活掌握是用C程序编写系统程序的基础。


其他对位进行操作的还有位域法;


几个对位操作的样例如下:


#define SETBIT(REG,N)   REG|=(1<<N)    //对REG的N位置1
 #define CLRBIT(REG,N)   REG&=~(1<<N)   //对REG的N位清零
 #define INVBIT(REG,N)    REG^=(1<<N)    //对REG的N位取反

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值