quote:以下是引用Zane在2011-04-05 00:19:00的发言:
我出一题吧:
N>3 的任意位数的循环移位。
以前正好做过一个,翻出来,加了一个用ENO判断移位是否正确执行.
合法移位0<=N<=63,程序如下:
FUNCTION "Shift_64bits" : VOID
TITLE =
AUTHOR : SXG
FAMILY : Shift
NAME : Shift_64
VERSION : 1.0
VAR_INPUT
X_Dword1 : DWORD ;
X_Dword2 : DWORD ;
X_ShiftNumber : INT ; //0 <= X_ShiftNumber <= 63
END_VAR
VAR_OUTPUT
Q_Shifted1 : DWORD ;
Q_Shifted2 : DWORD ;
END_VAR
VAR_TEMP
L_InputDword1 : DWORD ;
L_InputDword2 : DWORD ;
L_OutputDword1 : DWORD ;
L_OutputDword2 : DWORD ;
L_ShiftNumberDINT : DINT ;
L_InputAddress : DINT ;
L_OutputAddress : DINT ;
END_VAR
BEGIN
NETWORK
TITLE =
L #X_ShiftNumber;
L 63;
>I ;
JC err;
L #X_Dword1;
T #L_InputDword1;
L #X_Dword2;
T #L_InputDword2;
L #X_ShiftNumber;
ITD ;
T #L_ShiftNumberDINT;
L L#0;
T #L_InputAddress;
m001: A L [#L_InputAddress];
L #L_ShiftNumberDINT;
L L#64;
+D ;
T #L_OutputAddress;
= L [#L_OutputAddress];
L #L_InputAddress;
L L#1;
+D ;
T #L_InputAddress;
L 64;
>=D ;
JC end;
L #L_ShiftNumberDINT;
L L#1;
+D ;
T #L_ShiftNumberDINT;
L 64;
>=D ;
JCN m001;
TAK ;
-D ;
T #L_ShiftNumberDINT;
JU m001;
err: CLR ;
SAVE ;
BE ;
end: L #L_OutputDword1;
T #Q_Shifted1;
L #L_OutputDword2;
T #Q_Shifted2;
SAVE ;
BE ;
END_FUNCTION