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

划痕

  • 帖子

    2009
  • 精华

    23
  • 被关注

    16

论坛等级:侠圣

注册时间:2009-08-14

普通 普通 如何晋级?

发布于 2011-11-09 17:10:07

95楼

看了大家的程序,感觉都是太长了,不直观也不够技巧!(感觉大家没有拿出真本事哦)
今天动手做了一个小程序,可以实现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
欢迎测试,以下提供源代码下载!
点击此处查看附件
No discussion, no outcome.
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54616条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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