Уважаемые коллеги, Добрый день!
Подскажите пожалуйста алгоритм суммы бит формата LWORD (64 бит).
Ранее удалось найти код в STL для DWORD, для S7 300, CPU315-2 PN/DP:
L #Input
// x = (x & 0x55555555) + (x & 0xAAAAAAAA) >> 1;
PUSH
// копия ACCU1 в ACCU2
AD DW#16#55555555
// ACCU1 and 0x55555555
TAK
// ACCU1 > ACCU2
AD DW#16#AAAAAAAA
// ACCU1 and 0xAAAAAAAA
SRD 1
// ACCU1 >> 1
+D
// ACCU1 ACCU1 + ACCU2
// x = (x & 0x33333333) + (x & 0xCCCCCCCC) >> 2;
PUSH
AD DW#16#33333333
TAK
AD DW#16#CCCCCCCC
SRD 2
+D
// x = (x & 0x0F0F0F0F) + (x & 0xF0F0F0F0) >> 4;
PUSH
AD DW#16#0F0F0F0F
TAK
AD DW#16#F0F0F0F0
SRD 4
+D
// x = (x & 0x00FF00FF) + (x & 0xFF00FF00) >> 8;
PUSH
AD DW#16#00FF00FF
TAK
AD DW#16#FF00FF00
SRD 8
+D
// x = (x & 0x0000FFFF) + (x & 0xFFFF0000) >> 16;
PUSH
AD DW#16#0000FFFF
TAK
AD DW#16#FFFF0000
SRD 16
+D
T #Output
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
-
- эксперт
- Сообщения: 2338
- Зарегистрирован: 20 дек 2018, 04:45
- Имя: Сергей
- Страна: РБ/РФ
- город/регион: РФ Сергиев Посад
- Благодарил (а): 1992 раза
- Поблагодарили: 176 раз
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
По моему, 128 строк простого "ИЛИ" проще?
Тем долее что для DWORD тоже много получилось...
Тем долее что для DWORD тоже много получилось...
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.
-
- осмотрелся
- Сообщения: 166
- Зарегистрирован: 24 янв 2018, 11:18
- Имя: Антон
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 26 раз
- Поблагодарили: 27 раз
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
Можно же проще (word):
Для DWORD надо заменить:
16 на 32
LW0 на LD0
L1.0 на L2.0
SRW на SRD
Ну и инкремент счетчика можно оптимизировать
Код: Выделить всё
L #in_Word
T #inout_StoreWord
L 0
T #out_NumberofBitsHigh
L 16
NEXT: T #inout_LoopCounter
L #inout_StoreWord
T LW 0
A L 1.0
JCN zero
L 1
L #out_NumberofBitsHigh
+I
T #out_NumberofBitsHigh
zero: L #inout_StoreWord
SRW 1
T #inout_StoreWord
L #inout_LoopCounter
LOOP NEXT
16 на 32
LW0 на LD0
L1.0 на L2.0
SRW на SRD
Ну и инкремент счетчика можно оптимизировать
-
- эксперт
- Сообщения: 2338
- Зарегистрирован: 20 дек 2018, 04:45
- Имя: Сергей
- Страна: РБ/РФ
- город/регион: РФ Сергиев Посад
- Благодарил (а): 1992 раза
- Поблагодарили: 176 раз
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
Цикл не всегда проще, но всегда дольше.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик.
-
- осмотрелся
- Сообщения: 166
- Зарегистрирован: 24 янв 2018, 11:18
- Имя: Антон
- Страна: Россия
- город/регион: Калининград
- Благодарил (а): 26 раз
- Поблагодарили: 27 раз
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
Для данного случая код уж точно проще. Да и для понимания легче. В цикле тут копеечные инструкции, итераций мало, поэтому не критично.
Но в общем случае вы правы.
Поправка:
L1.0 на L3.0
"Сумма бит" LWORD (S7 1500, CPU1515-F2 PN)
Всем спасибо и с наступающим новым годом!
Забыл отписать. Все намного проще оказалось)
Фото в покреплении
Забыл отписать. Все намного проще оказалось)
Фото в покреплении
У вас нет необходимых прав для просмотра вложений в этом сообщении.