Бинарные операции в 1С 7.7 #113163


#0 by Klio
Для записи на дискету нужно посчитать контрольную сумму в 1С по вот такому алгоритму :DWORD calcCRC16(DWORD iPrevSumm, BYTE *btArr, UINT iLen){}На вход подаем btArr столько раз, сколько строк iLen - длина входной строкиСделал в 1С через работу со строками - ужасные тормоза.Самому писать ВК - ломает, давно уже на сях не лепил.Мож есть уже готовая ? Киньте ссылкой плз.или алгоритм для 1С - мож кто более быстрый придумает.
#1 by IAm
Причем тут строки, все операции делаются с числами и работают вполне быстро. Раскладывай коды символов на степени дойки и производи с ними нужные операции.
#2 by Klio
Помоему 1С не позволяет делать ПОБИТНЫЕ ОПЕРАЦИИ "Логическое ИЛИ" и т.д.Мож я не прав ? Тогда строчку кода плз.
#3 by Klio
+ Ну получу я код буквы "А" - 145,как мне его побитно ксор сделать с 30467 ?
#4 by IAm
Код писать лень.Простейший алгоритм, нам нужна функция дляполучения логического ИЛИ двух чиселРаскладываешь их по степеням двойки в две строки1001000100101101потом проходишь по каждому символу, получаешь10111101и преобразовываешь эту строку в число, умножая каждую единицу на нужную степень двойки.
#5 by Klio
+ ===> Сделал в 1С через работу со строками - ужасные тормоза.Я это и имел ввиду !
#6 by IAm
Покажи код.
#7 by smaharbA
подскажи iPrevSumm>>8 и iPrevSumm<<8 на сях что? счас свояю
#8 by IAm
И скажи сколько символов в файле.(конечно через длл га С++ будет быстрее, но тут роде бы тоже большим тормозам взяться неоткуда)
#9 by smaharbA
необязательно на 1Сэ, ест ВБС и наконец офис(можно хоть свой ГУИ своять)
#10 by IAm
собственно вот описанное в http://1c.realnet.ru/cgi-bin/forum.cgi?ask=12755
#11 by Klio
На вход алгоритма дается не менее 100 строк с длиной от 1 до не менее 100 символов.У меня получилось каждый символ через 2 цикла пропускать на каждой логической операции - которых 3, Жуть !Еще сдвиг - тоже символьные опреации Лев - Прав.Ща код вывалю.iPrevSumm>>8 - Это логический сдвиг на 8 битов вправо.
#12 by smaharbA
еще вопрос с возвратом на первый бит (и сразу или через бит четности или как еще) ?
#13 by Klio
IAm спасибо за ссылку - только не могу оттуда достать файлы Ж:0~А вообщем там помоему еще хуже ( в смысле медленнее ), чем у меня сделано.Вот творение моего гения :) - оптимизированное до невозможности ! ;)и т.д. до 32
#14 by Klio
+ Не захватил немного
#15 by smaharbA
заменидлинакода=стрдлина(код)на прав(нули+кс,длинакода) и определяй длинукода один раз в начале функции
#16 by Klio
Я так и знал, что можно еще что-то придумать !!!Спасибо smaharbA !!! Одним циклом меньше.
#17 by Klio
+ БинарныеЗначения[] - это таблица строк, представляющих числадля быстрого перевода кода символа, заполняется 1 раз при старте 1С :БинарныеЗначения[ 16 ] = "00010000" и т.д. до 256
#18 by smaharbA
слушай у тебя нет "арифметического" алгоритма сдвига влевовправо просто CS=a / (2 ^ n) (правда проблеммы с округлением, но решаемо)
#19 by smaharbA
+ ^ - здесь это степень
#20 by Klio
Таак !!! Сейчас взглянул на свой алгоритм еще разок,я ж отказался от процедуры сдвига !!! Ж:)Вместо сдвигов у меня в РасчетКС :    ч2 = Прав( ПредСум, 8 ) + и т.д.Отказался от универсальности, Принял длину ПредСум = 16.
#21 by Klio
Потом число все-равно переводить в строку,а переводить на лету все-ж таки медленнее, чем выбрать значение из массива.К слову вот процедурка, которой я заполняю БинарныеЗначения[], повторюсь, она работает всего один раз при старте 1С :
#22 by Klio
+ В смысле один раз для каждого значения массива.Сначала хотел универсальности, но жизнь в лице 1сv7 сказала, что не будет мне счастья на её платформе с такими замашками.
#23 by smaharbA
вобщем так тупенько(мож где ошибся)For i = 1 To 255CRCTAB_16(i) = CRCTAB_16(i - 1) + &H1021NextIf a > 0 ThenFor i = Int(Log(a) / Log) To 0 Step -1If res + 2 ^ i > a Thenastr = astr + "0"ElseNextElseIf leftorright ThenFor i = 1 To cslen  For i = 1 To Len(btArrStr)    iPrevSumm = (CRCTAB_16(sdvig(iPrevSumm, 8, True) And &HFF) Xor sdvig(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And &HFFFF  NextWscript.echo calcCRC16(0, "kl;sfj ;lskdjf;dfj1")(вроде все верно)
#24 by smaharbA
Немного пичасал (для универсальности) теперь прикрутить к 1Сэ проблем несоставит, можно и под ней запускать через содатьобъект и т.д.....Dim CRCTAB_16...  For i = 1 To Len(btArrStr)    iPrevSumm = (CRCTAB_16(sdvig(iPrevSumm, 8, True) And &HFF) Xor sdvig(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And &HFFFF  NextEnd Function...  If a > 0 Then    For i = Int(Log(a) / Log) To 0 Step -1      If res + 2 ^ i > a Then...end function...main
#25 by callisto
нестыковочка в :))"длиной от 1 до не менее 100 символов" - т.е. длина в диапазоне от 2 до 99 в условие не попадает... :))
#26 by orefkov
#27 by orefkov
+26.Блин, сдвиг влево/вправо перепутал, чуть подправить надо.
#28 by orefkov
Функция ЛогическоеСложение(Знач Число1, Знач Число2)
#29 by smaharbA
ты это чего, если так сдвиг понимать то все просто, но сдвиг то с "уходом" последнего/первого бита, вот тут и проблемма...
#30 by smaharbA
да конечно мне тож надо подправить (сделал минимальную длинну кода 2 байта)
#31 by orefkov
#32 by orefkov
При сдвиге вправо уход первого бита отсекается ЦелПри сдвиге влево надо тогда задавать еще разрядность числа,например при 16 разрядах надо тогда сделать так:те отсекать путем остатка от деления на 2^(разрядность числа),Но конкретно в данном случае уход за 16 разряд несущественен,так как все равно к первому сдвигу применяется &0xFF (отброс битов старше 8), и потом &0xFFFF (отброс битов после 16)
#33 by Кукуруза
Написал бы dll, как OLE сервер, и дело с концом
#34 by smaharbA
точно...
#35 by orefkov
Функция ЛогическоеСложение(Знач Число1, Знач Число2)
#36 by smaharbA
тока подправь % 255 и % 65535это FF и FFFF соответственно
#37 by orefkov
Не, "& 0xFF" в С++ == "% 256" в 1С, тк остаток от деления на 256 как разот 0 до 255.
#38 by Klio
( 25 ) Очепятался - длина или 1, или >= 1002 All - Спасибо за помощь, сегодня попробую все,вечером скажу чья метода быстрее.2 orefkov : Если Вы автор 1С++,подскажите что будет быстрее работать в цикле ? а) код на 1С б) вызов Wscript 10000 раз в) вызов функции DLL ( OLE ) 10000 раз г) Что-нибудь еще?Я слышал, вызов функций через OLE в 1С не самая оптимальная разработка.
#39 by IAm
Хоть и не автор 1С++, но быстрее всего будет работать длл на С++ со встроенными побитовыми операциями
#40 by orefkov
Я не автор 1С++, хотя часть моего кода там есть.А по поводу быстродействия - хз, смотря что за кодв каждом конкретном случае. Тестировать надо.
#41 by Klio
2 orefkov :=============> Если надо, кину код для ^, |, &, ~, <<, >>Надо :) для XOR ! - для скорости теста.
#42 by ВоВаК
А что этот процент (%) значит? Остаток от деления?
#43 by orefkov
+ и выполненная по технологии Rainbow. XOR - это и есть ЛогическоеСложение (код уже был)...// ^Функция БитовыйXOR(Знач Число1, Знач Число2)
#44 by orefkov
#45 by smaharbA
похоже алгоритм будет верно работать только с побитовыми (относится только к ксор) операциями, так что кучу циклов в КСОР необойти...
#46 by orefkov
Щас прогнал тестик, 100 раз по строке 100 символов,на Cel-2.4G примерно 4 сек.
#47 by smaharbA
на ВБС тот же результат для файла 60 кб строк 1373 но на цел667, да там еще и файл читает и результат в файл записывает по строке на контр.сумму.
#48 by smaharbA
вот мой вариант (с учетом обнаруженного у orefkov, спасибо) но на ВБС...  For i = 1 To Len(btArrStr)    iPrevSumm = (CRCTAB_16(sdvigNew(iPrevSumm, 8, True) And 255) Xor sdvigNew(iPrevSumm, 8, False) Xor Asc(Mid(btArrStr, i, 1))) And 65535  NextEnd Function'...Function sdvigNew(a, n, leftorright)  if at<2^15+1 then'...mainIf WScript.Arguments.Count > 0 Thenend if(прикрутить к 1Сэ труда несоставит, но у orefkov лучче по той причине что написано все на 1Сэ)
#49 by smaharbA
небольшая поправка вместо 2^15+1 надо 2^16-1
#50 by ВоВаК
Прикольная реализация исключающего ИЛИ. Сам придумал?Результат = Бит * (((Число1 Mod 2) + (Число2 Mod 2)) Mod 2) + Результат
#51 by orefkov
В некоторых источниках "Исключающее ИЛИ" называется"Сложение по модулю 2"
#52 by Klio
2 orefkov :   Прогнал Ваш алгоритм - ошибка.   Здесь :========> 1+((Цел(ПредСумма)/256) % 256))   Если ПредСумма = 12504, должно быть 49 !!! Это 5-й символ, первые 4 на ура, я уж и обрадовался.2 smaharbA : я тоже подумал, если доделаем алгоритм оrefkov, тогда можно избежать геморроя с wScript, машины везде разные, 98, XP, 2000 :) Но все-равно спасибо за поддержку.
#53 by orefkov
Так 49 и получается.
#54 by orefkov
+53 вот блин1+((Цел(ПредСумма/256) % 256)
#55 by smaharbA
можешь закинуть в ворд, и по оле открывать вернет в 1С строку, файл можно и не показывать... (ворд счас практически у всех есть), делаем проверку на скрипт - запускаем скрипт, нет - запускаем через ворд...
#56 by ВоВаК
Угу, у них математиков, а у нас смертных это булева операция :) Если приёмник или (Или) источник истина, при условии что они неравны (исключение), то и результат тоже истина.
#57 by NS
Ниасил ветку.Сделай массивы. Для NOT(на 256 элементов),XOR,OR(на 256*256 элементов).Остальное из них сварганишь.И очень быстро будет считать.Хранить массивы можешь в файле.
#58 by ВоВаК
Что ни говори, как не извращайся, а процессор выполняет булевые операции над регистрами за 1 такт.
#59 by smaharbA
если данные в 1 - 2 байта, счас и 4 обрабатывает (но там не все так просто), но и при этом надо комманду загрузить + данные, если длинна данных до 3 байт то в некоторых операциях и за такт
#60 by NS
не понял - это к чему?Даже ММХ работает с восьмью. Не говоря о том, что сейчас.А процессор - 32битный, и обрабатавает соответственно 4 байта за операцию.Насчет тактов - там есно всё не так просто.А вот с двумя как раз всё плохо. У Пня четвертого на 16 разрядных операциях затыкается конвеер - легко проверить даже в тех-же делфях.Скорость обработки 8битных и 32битных примерно одинаковая (в расчете на бит - 32 битные в четыре раза быстрее, ММХ еще почти в два раза быстрее)
#61 by ВоВаК
А почему до 3-х? За 1 такт выполняются почти все операции с регистрами в качестве операндов. Это я вообще всё к чему говорю, нашёл в инете перекомпилированную в DLL ollydbg и через VB-шную ActiveX.DLL сделал к ней интерфейс.Саму библиотеку выложил у себя на сайте:http://basicproduction.nm.ru/TOOLS/olly_dll.zip Кто хочет действительно быстро что то посчитать вполне может ей воспользоваться. Я проверял - всё работает.
#62 by ВоВаК
А 10 байт MMX не берёт? Ведь в сопроцессор можно и BCD грузить.
#63 by ВоВаК
Может из за того что 16-разрядные операции длиннее за счёт префикса размера операнда?
#64 by smaharbA
а куда вы команду денете из тех 4 байт? ребята, новые знаю слабовато но принцыпы неизменились начиная с 4040/8080... (тока ненадо про всякие конвееры и такуюже лабуду АЛУ как работало на 4 битах так и работает + команду надо отправить, если все отправлять за такт то и выходит 8 бит команда 24 бита данные, но это утрированно)
#65 by ВоВаК
Действительно на старых процессорах эти операции выполнялись за несколько тактов, но начиная с 486, за один.
#66 by ВоВаК
http://www.5ka.ru/95/27252/1.html.Элементарные операции целочисленного АЛУ.Логическое сложение, ИЛИ|V, |, or.Именно эти операции выполняются за один такт микропроцессора, иимеют наибольшую скорость выполнения.
#67 by smaharbA
не читайте публицистику, там все врут...подумай как сделать операцию с двумя словами (пусть уже каждое и в регистре) нужно отправить команду(такт) и выполнить действие(такт)...и незабудьте что в регистрах данные сами по себе не рождаются шина то 32 тоесть чтоб запихать из озу в каждый регистр по слову надо 2 такта - итого 4 такта, конечно сама логика выполняется за такт(невсегда, тут все упрощенно описал) но данные надо передать
#68 by NS
То, что я привел цифры - тестировалось мной в Делфях.Делфи тоже врут? Код ассеблерный на таких операциях у них идеальный.
#69 by smaharbA
+ и еще, ребята на 8080 сваял не один контроллер, даже нашол ошибку в выполнении аппаратного прерывания в нашем варианте 580ик80... не изменилась даже система команд(почти)... и данные хоть 8 битные хоть 32 битные идут все по темже 8 и 32 "проводкам" соответственно (если не принимать в счет последовательную/параллельнопоследовательную передачу)
#70 by ВоВаК
В смысле код идеальный? Ты опкоды имеешь ввиду?
#71 by ВоВаК
Во первых у пенька вроде уже 64-битная шина данных, а во вторых зачем работать со словами? Лучше уж с байтами или двойными словами. Слова скорее нужны для совместимости со старым, 16-разрядным режимом процессора.
#72 by NS
Я имею в виду ассемблерный код, поле компиляции, который, например, можно увидеть при отладке.
#73 by smaharbA
ну я имел в виду двойные слова
#74 by ВоВаК
Вообще кому нибудь будет интересен рантаймовый ассемблер? Можно мнемоники на русский попереводить, щоб вообще как у 1С было :)
#75 by Klio
2 All : Все это очень интересно, НО !!!Мой алгоритм эмулирования бинарных операций через строки создает файл размером 82 кб за 8 сек. (восемь)Алгоритм г-на orefkov при формировании того-же файлаработал 52 сек. (Пятьдесят две) :(О) !!!Я открыт для вопросов и замечаний !Одна тонкость :  Данные для РасчетКС и соответсвенно Контролька подаются по 10 - 50 байт, может из-за этого ?Система : P4-3.2 HT 512mb 2channel DDR 400, WinXP SP1    1C:Предприятие вер. 25 сетевая - комплексная.    Тестировал локально.
#76 by smaharbA
а не проверял?
#77 by Klio
Только пришел домой, сразу налепил две обработочки - для сравнения. После результатов - кинулся смотреть почему ?Видимо конкатенация и анализ строк в 1С быстрее, чем деление-умножение ???Кто не верит, могу кинуть на мыло - 30 кг.Обработки работают с любой конфой.Щас попробую , но с wScript-aми совсем не дружу, результаты если появятся, то не сразу.Здесь можно как-либо файлик выложить ? Или скриншот ?Вставил бы сам в шаблон - все быстрее чем я.
#78 by Klio
+ Сейчас поковырял и понял что ничего не понял.Не знаю даже с какой стороны подступиться.Попробуй пошагово объяснить что делать, если не в лом.
#79 by smaharbA
создай файл с расширением VBS как параметр передай имя файла из тойже директории (конечно лучче простой текст, но для сложности можно что попало), создаст файл имяфайлапреданногокакпараметрсрасширением.crcтам будут контрольные суммы всех строк в хексе...
#80 by smaharbA
+ используй
#81 by Klio
Запустил, алгоритм немного не тот.контрольная сумма должна быть одна по всему файлу.Результат расчета первой строки должен попасть на входк расчету второй строки в iPrevSummПробовал поправить, ошибка сравнения типов :(А главное, как мне результат к 1С прикрутить ?И придется её из командной строки из 1С вызывать постоянно ?
#82 by smaharbA
нет ненадо постоянно позже покажу, понял нужно результат строки запихивать в начало
#83 by smaharbA
подправил последний кусок чтоб и общюю ЦРЦ вписывалоmainiPrevSummTemp=12504If WScript.Arguments.Count > 0 Then  Do While Not f.AtEndOfStream...чуть позже напишу как 1Сэ присобачить
#84 by Klio
Работает !Отдельно от 1С по времени вроде быстро, а если этой функции по 50 байт скармливать из 1С?Смысл в том, что файл содержит в себе несколько секций со своими КС, а потом в конце считается общая КС по файлу.Добавь только плз в первую и последнюю строку выходного файла текущее время, у меня нет секундомера в наличии :)
#85 by smaharbA
делаешь обработку на кнопку вешаешь сформировать, длбавляешь поле ввода с кнопкой тип-строка, длинна 255в модуле формы вот это (можно переделать и под "поток" строк не из файла, это уж силами 1Сэ)....
#86 by smaharbA
+ но тут ограничено время действия скрипта, так что лучче запускать внешний, но не командасистемы, а темже WSH, а как вернуть параметры в 1Сэ позырю, делал...
#87 by smaharbA
файл ERT - Работало 741 мс., размер файла 25088, Терминал, не очень скоро вышло, но надо учесть время на Сообщить да и работает с файлами на чтение и на запись, а не с "потоком" строк...заменил Сообщить(scrptCtrl.run("startCRC"));на следующее...(чтоб время считать)
#88 by smaharbA
ну вот с внешним скриптом в 100!!! раз быстрее, вариант для 1Сэ (можно убрать создания файла, пусть все время будет)...........результаты на П4-2.8.......Работало 737 мс., размер файла 25088Работало с внешним скриптом 6 мс., размер файла 250885180Работало 746 мс., размер файла 25088Работало с внешним скриптом 5 мс., размер файла 250885180Работало 753 мс., размер файла 25088Работало с внешним скриптом 7 мс., размер файла 250885180Работало 737 мс., размер файла 25088Работало с внешним скриптом 6 мс., размер файла 250885180Работало 740 мс., размер файла 25088Работало с внешним скриптом 5 мс., размер файла 25088
#89 by smaharbA
и вот еще в 3-4 раза быстрее стало )да файл неочч большой 20 кб и 394 строки) результаты (все иду спать):Работало 743 мс., размер файла 25088Работало с внешним скриптом 1 мс., размер файла 250885180Работало 745 мс., размер файла 25088Работало с внешним скриптом 2 мс., размер файла 250885180Работало 741 мс., размер файла 25088Работало с внешним скриптом 2 мс., размер файла 250885180Работало 739 мс., размер файла 25088Работало с внешним скриптом 1 мс., размер файла 250885180Работало 739 мс., размер файла 25088Работало с внешним скриптом 2 мс., размер файла 250885180Работало 738 мс., размер файла 25088Работало с внешним скриптом 2 мс., размер файла 25088
#90 by Klio
То smaharbA - Результаты говорят сами за себя !Сажусь изучать работу с wScript. Спасибо !!!На моем файле 4 сек. без WshShell.run противлучшего результата 1С - 8 сек.То All : Тема исчерпана.Модератору : Как закрыть ветку ?
#91 by Z1
Изучай сразу С,С++ на нем еще быстрее будет
#92 by Прохожий
Перед публикацией сообщений следует сразу читать пост №0
#93 by Прохожий
Поправлю:Сообщение 92 для .
#94 by Z1
Это написано после цитаты из "Сажусь изучать работу с wScript. Спасибо !!!"Вся ветка имеет чисто спортивный интерес.Каждый язык программирования имеет свое назначение и писать subj на1c это как анектот про гланды
#95 by Прохожий
Для Z1:Автор этой ветки - Klio.Поэтому всё же читать пост №0 следует:)
#96 by Z1
Автор поста тоже Kilo. В течении обсуждения от 0 до 90автор ветки пришел к выводу что решить задачу лучше на wsh.я же его автора Kilo прошу обратить внимание что на языке "С" будетработать на порядок быстрее чем на wsh и ничего более о чем кстати тоже говорилось в некоторых постах. Больше в эту ветку не буду писать а то уже неконструктивный разговор пошел :))).
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С