一:C语言实现循环移位:

比如将a=0x45循环左移二位。a循环左移n位,即将原来右面(8-n)位左移n位,而将原来左端的n位移到最右面n位。

实现步骤:

1、将a的左端n位先放到b中的高n位中

b=>>(8-n);

2、将a左移n位,其右面高n位被补0

c=<

3、将b,c进行或运算

a=c|b;

程序如下:

main()

{

unsigned   char   a=0x45,b,c;

unsigned   int   n=2;

b=a>>8-n)

c=a<

a=c|b;

}

二:Keil C言实现循环移位

在Keil C51中有这样一个库,其头文件为在C51\INC目录下,有以下几个操作,它不是函数,但象函数,它们有入口出口,但是,没有返回RET语句,如果有这些操作,用disassembly窗口可以看到是将代码直接嵌入到你的代码中,其效率很高,比如一个空操作,_nop_()   嵌入的代码就是一个NOP指令。   在这个库中,有如下操作:

unsigned   char   _chkfloat_(float   val)   检查浮点数状态

返回值:0:   standard   floating-point   numbers

1:   Floating-point   value   0

2:+INF   (positive   overflow)

3:-INF   (Not   a   number)   error   status

unsigned   char   _crol_(         //字节的多次循环左移

unsigned   char   c,   //C左移的字符

unsigned   char   b);//b左移的位数

unsigned   char   _cror_(         //字节的多次循环右移

unsigned   char   c,   //C右移的字符

unsigned   char   b);//b右左移的位数

unsigned   int     _irol_   (         //字的循环左移

unsigned   int   c,     //c左移的字

unsigned   char   b);//b左移的次数

unsigned   int     _iror_   (         //字的循环右移

unsigned   int   c,     //c右移的字

unsigned   char   b);//b右移的次数

unsigned   long   _lrol_   (         //4字节(双字)的循环左移

unsigned   long   c,//c左移的双字

unsigned   char   b);//b左移的次数

unsigned   long   _lror_   (         //4字节(双字)的循环右移

unsigned   long   c,//c右移的双字

unsigned   char   b);//b右移的次数

void   _nop_     (void);         //NOP   8051中的空操作

bit     _testbit_   (bit   b);//8051中的JBC指令,测试b,然后清0,返回b的值。

下面是我自己以前写的东西

汇编的移位操作很容易   RR   RRC   RL   RLC

C51中,移出很容易,<<   >>   ;移入操作中的左移入也容易,困难在右移入

一:IC读写应用

1:送数

送两个单独字节的数据的程序,左送   &0x80             右送   &0x01

bit   out;

out   =   low   &   0x01;

low   >>=   1;

low   |=   (high   &   0x01)<<7;

high   >>=   1;

2:取数(不管怎么移入,第一次操作之后获取的那一位数据必须在接受数据的最高位或   者最低位上,从而选择是先取数还是先移位)    a:如果是先接受高位后接受低位   则先左移一位后接受一位数据(i2c总线)

uchar   i;

uchar   temp   =   0;

uchar     date   =   0x82;

for   (i   =   0;   i   <   8;   i++)

{

temp   <<=   1;                           //左移

temp   |=   (bit)(date   &   0x80);

date   <<=   1;

}

b:如果是先接受低位,后接受高位   则先接受一位数据后循环右移一位

uchar   i;

uchar   temp   =   0;

uchar   date   =   0x82;

for   (i   =   0;   i   <   8;   i   ++)

{

temp   |=   (bit)(date   &   0x01);

date   >>=   1;

temp   =   _cror_(temp,1);

//循环右移,应用_cror_()需要包含头文件}

如果不用函数

则for循环应该这样写

for   (i   =   0;   i   <   8;   i   ++)

{

temp   >>=   1;

temp   |=   (date   &   0x01)   <<   7;

date   >>=   1;

}

三:任意一位的置位或者取反运算

置位运算

low   |=   0x01;     (置最低位为1)

取反运算

low   |=   ~low   &   0x01;

四:合并和拆分数据

1:合并两个单字节数据为一个双字节数据

int   len;

uchar   low;

uchar   high;

Len   |=   high;

Len   <<=   8;

Len   |=   low;

2:   拆分一个双字节数据为两个单字节数据

int   len;

uchar   low;

uchar   high;

low   |=   len;

high   |=   len   >>   8;

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐