回复:怎样实现64位循环左移?(转)

n次看你的背影

  • 帖子

    2321
  • 精华

    73
  • 被关注

    53

论坛等级:奇侠

注册时间:2008-03-11

普通 普通 如何晋级?

发布于 2011-11-10 13:51:02

98楼

quote:以下是引用划痕在2011-11-09 17:10:07的发言:
看了大家的程序,感觉都是太长了,不直观也不够技巧!(感觉大家没有拿出真本事哦)
今天动手做了一个小程序,可以实现N>2位数据顺序左移x位(x小于N),在此与大家分享一下!
<欢迎拍砖,如果你还能做的更简单那就更好啦 ^_^ >
程序中只用了一个地址指针,使用了间接寻址,强化了对temp堆栈区的使用;以下例程能实现N<64位的任意位数的左移x位的功能,只要稍加修改就能实现在65536位数的左移功能!
FUNCTION "Shiftbit" : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
count : INT ; //the number of bits
db_num : BLOCK_DB ; //DB No.
shift_num : INT ; //number of shift
END_VAR
VAR_TEMP
temp1 : DWORD ; //save 32 bits
temp2 : DWORD ; //save 32 bits
temp3 : INT ; //count
temp4 : BOOL ; //save signal
temp5 : DINT ; //address pointer
END_VAR
BEGIN
NETWORK
TITLE =
OPN #db_num;
L #shift_num;
L -1;
+I ;
LAR1 ; //初始化AR1
L L#0; //初始化地址指针
T #temp5;
L DBD 0; //数据暂存起来
T #temp1;
L DBD 4;
T #temp2;
L #count; //计数总位数
next: T #temp3;
A L [#temp5]; //取出第temp5位
= #temp4; //暂存起来
L #temp5;
L 1;
+I ;
T #temp5; //地址指针指向下一位(temp5=temp5+1)
TAR1 ;
L 1; //移位地址指针(偏移量)
+I ; //偏移量是否超过总的位数
LAR1 ;
TAR1 ;
L #count;
JCN _001;
JU _002;
_001: L L#0; //超过总位数清零
LAR1 ;
_002: A #temp4;
= DBX [AR1,P#0.0]; //送达目的地
L #temp3;
LOOP next; //剩余移位计数
SET ;
SAVE ;
BE ;
END_FUNCTION
欢迎测试,以下提供源代码下载!
点击此处查看附件



呵呵,划痕兄弟,有时候说话一定要委婉!你程序短,只是你只能对DB里面数据进行移位,并没有对你的输入形参的数据区进行判断,缺少必要的考虑;比如有个M区需要移位,估计你就需要先把M区的内容拷贝到DB了?如果是L区呢?如果移位数输入是个负数呢?你的程序又该如何执行呢?我个人觉得存在较多漏洞。。。。。。还需完善哦!建议使用any数据类型指针试试。对了,即使你以后做出较好的程序,也需要低调哦。^_^,继续努力!
佛对我说:“你的痛苦来自于你的欲望,没有欲望也就没有痛苦!”
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54618条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。