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

傻ザ蛋

  • 帖子

    26
  • 精华

    0
  • 被关注

    4

论坛等级:游侠

注册时间:2010-06-27

普通 普通 如何晋级?

发布于 2012-01-31 14:13:17

104楼

任意位数的循环右移N位
FUNCTION_BLOCK FB120

VAR_INPUT
Plus: BOOL;移位脉冲
length: INT;所需要移动位数
M_Num: INT;循环移位的长度
END_VAR

VAR_IN_OUT
S_Pointer: ANY;移位的起始地址
END_VAR

VAR_OUTPUT


END_VAR

VAR_TEMP
Buffer1: anypoint;
S_Temp AT Buffer1: ANY;
BitNr1: INT;
ByteNr1: INT;
Offset: INT;
T_Byte: INT;
T_Bit: INT;
i: INT;
j: INT;
Temp: BOOL;
END_VAR
VAR
T_Plus: BOOL;
L_Plus: BOOL;

END_VAR

LABEL
lab3;
END_LABEL

S_Temp := S_Pointer;


BitNr1:=WORD_TO_INT(DWORD_TO_WORD(Buffer1.BytePointer AND DW#16#7));
ByteNr1:=WORD_TO_INT(DWORD_TO_WORD(SHR(IN:=SHL(IN:=Buffer1.BytePointer, N:=8), N:=11)));

T_Plus := Plus AND NOT L_Plus;
L_Plus := Plus;

IF T_Plus = true THEN

FOR j:=0 TO M_Num-1 BY 1 DO
Offset := WORD_TO_INT(DWORD_TO_WORD(Buffer1.BytePointer AND DW#16#00FF_FFFF));
T_Byte := (length - 1 + Offset)/8;
T_Bit := length - 1 + Offset - (T_Byte * 8);

Temp := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit];
FOR i:=0 TO length - 1 BY 1 DO

IF T_Bit < 1 THEN
T_Bit:=7;
T_Byte:=T_Byte - 1;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte+1,0] := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit];
GOTO lab3;

END_IF;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit] := WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[T_Byte,T_Bit-1];
T_Bit := T_Bit - 1;
lab3:;
END_FOR;
WORD_TO_BLOCK_DB(Buffer1.DB_Number).DX[ByteNr1,BitNr1] := Temp;
END_FOR;

END_IF;

END_FUNCTION_BLOCK
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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