原创 C语言循环移位及位操作

2009-11-8 14:50 9431 2 7 分类: 软件与OS

                                                                                           ---xiaoxiaopig


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位取反


 

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户377235 2013-4-8 16:24

茅塞顿开!

用户377235 2012-11-26 19:44

这个还,学习了

用户123840 2009-11-29 13:01

多多交流,相互学习^_^

用户555785 2009-11-23 15:51

了解了,谢谢。

xucun915_925777961 2009-11-23 11:32

好,学习一下,谢谢!
相关推荐阅读
用户1495304 2009-11-16 16:29
C语言的条件编译
有些程序在调试、兼容性、平台移植等情况下可能想要通过简单地设置一些参数就生成一个不同的软件,这当然可以通过变量设置,把所有可能用到的代码都写进去,在初始化时配置,但在不同的情况下可能只用到一部分代码,...
用户1495304 2009-11-16 15:48
条件编译/条件宏定义
                                                                                          ---xiaoxia...
用户1495304 2009-11-16 14:12
C语言中动态内存分配
                                                              ---xiaoxiaopig      2009/11/16  “动态”(D...
用户1495304 2009-11-09 17:39
Ubuntu使用笔记
1、Ubuntu8.04下的回收站好像是没有还原功能,但可以通过复制的方式来还原。2、安装Ubuntu后有些菜单是有中文的,但右键基本上是英文,这并不是说已经安装了中文包。安装中文包过程:分别选择Sy...
用户1495304 2009-11-08 14:40
指针的用法
                                                                                                   -...
我要评论
5
2
关闭 站长推荐上一条 /3 下一条