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