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数据类型指针试试。对了,即使你以后做出较好的程序,也需要低调哦。^_^,继续努力!