打印

C51如何实现带进位的循环移位?

[复制链接]
8876|14
手机看帖
扫描二维码
随时随地手机跟帖
沙发
一级菜鸟| | 2007-8-24 22:50 | 只看该作者

C语言编程,尽量避免直接操作寄存器

char型的,就使用int型中转,int型的,就使用long中转,移出的位在高位字节中,取出处理即可

使用特权

评论回复
板凳
戴栋宇| | 2007-8-25 08:14 | 只看该作者

环移的实现


加入本征函数文件intrins.c,也称内联函数,这种函数不需要调用,编译时直接插入当前行就好了。
左环移:
 #include <reg51.h>
#include "instrins.c"
#define uchar unsigned char 
main()
{
 uchar _crol_(uchar a,uchar n);/*函数原型*/
 uchar a=0x01;
 a=_crol_(a,1);/*结果a=0x02*/
}
右环移
uchar _cror_(uchar a,uchar n);/*函数原型*/
同样用上面的方法就可以实现环移了。

 

使用特权

评论回复
地板
zhaoyu2005| | 2007-8-25 08:19 | 只看该作者

LS说错了,不调用怎么执行?

想使用函数必须调用,你说的是不用提前声明,其实
#include "instrins.c"
这一句相当于把它包含的所有函数声明了

使用特权

评论回复
5
xwj| | 2007-8-25 09:03 | 只看该作者

LS,内联函数是直接插入代码

不过,貌似Keil不能支持复杂的内联函数

PS :
现在的Keil应该
#include <INTRINS.H>
可以自己打开KeilC51INC目录下的INTRINS.H看看

使用特权

评论回复
6
古道热肠| | 2007-8-25 10:00 | 只看该作者

也只有3楼的办法效率较高

    但其移植性不强,唉,C语言在这种循环移位的架构上,天生就比汇编差。搞不懂当年规划C语言运算符时,为什么不整一个循环左移和右移的运算符。

使用特权

评论回复
7
popmu| | 2007-8-25 10:11 | 只看该作者

那也要编译器支持才行啊:)

使用特权

评论回复
8
gyt| | 2007-8-25 10:51 | 只看该作者

必定是当初

必定是当初搞51C的时候,那些做汇编的工程师认为没有必要再有带进位循环移位这个功能。

可能他们认为用到这个功能的基本上是一些算术运算模块,而C已经包含了直接进行这类运算的语句。

使用特权

评论回复
9
yongzai| | 2011-5-9 12:25 | 只看该作者
看了一下

使用特权

评论回复
10
ljm810010| | 2011-5-9 12:32 | 只看该作者
还有 SWAP ,XCH 也相当郁闷。

使用特权

评论回复
11
DownCloud| | 2013-3-10 22:06 | 只看该作者
请问到底如何实现带进位移位,想实现CY移入某内存字节中!!!!!!!!!!!!!插入汇编的方法不用。

使用特权

评论回复
12
DownCloud| | 2013-3-10 22:07 | 只看该作者
回的unsigned char _crol_    (unsigned char, unsigned char); 根本不能用 这个只是循环移位而已,哪里带进位了!

使用特权

评论回复
13
DownCloud| | 2013-3-10 22:07 | 只看该作者
回的unsigned char _crol_    (unsigned char, unsigned char); 根本不能用 这个只是循环移位而已,哪里带进位了!

使用特权

评论回复
14
DownCloud| | 2013-3-10 22:10 | 只看该作者
谁帮我一下,我想实现5个字节无间断的移位。 倒霉! 要是四个字节就好了。。。

使用特权

评论回复
15
DownCloud| | 2013-3-10 23:07 | 只看该作者
左移入1.........
for(i = 0,temp = 0;i < 5;i++)    //5字节连接左移,移入新一位1   
{
    temp = temp | _cror_(LedDots[i] & 0x80,7 - i);     
    LedDots[i] = LedDots[i] << 1;
}
LedDots[0] |= 0x01;
LedDots[1] |= (temp & 0x01);
LedDots[2] |= ((temp >> 1) & 0x01);
LedDots[3] |= ((temp >> 2) & 0x01);
LedDots[4] |= ((temp >> 3) & 0x01);
                       

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

34

帖子

1

粉丝