Имя: Пароль:
1C
 
Коньюкция
0 DenIv
 
17.09.09
10:04
Доброе утро, господа помогите реализовать функцию логического "И" на 1С
Заранее признателен
1 los_hooliganos
 
17.09.09
10:04
если (условие1) и (условие2) тогда
2 ДенисЧ
 
17.09.09
10:04
(а=б) И (ц=д)
3 DGorgoN
 
17.09.09
10:04
опередили
4 inka
 
17.09.09
10:06
(0)для дизьюнкции будет отдельный топик?
5 DenIv
 
17.09.09
10:13
(1) и (2) речь о двоичной логике, например реализация XOR
Функция XOR(Val ПарА, Val ПарБ)  Экспорт
   Рез = 0;
   К = 1;
   Для BitNumber = 1 По  8 Цикл
       БитА = ПарА % 2;
       БитБ = ПарБ % 2;
       ПарА = Цел(ПарА / 2);
       ПарБ = Цел(ПарБ / 2);
       БитВ = (БитА + БитБ) % 2;
       Рез = Рез + БитВ * К;
       К = К * 2;
   КонецЦикла;  
   Возврат Рез;
КонецФункции

нужен аналог для AND
6 los_hooliganos
 
17.09.09
10:13
Функция ФункцияИ(Условие1,Условие2)
Рез1 = 0;
Рез2 = 0;  
Если Условие1 Истина Тогда
Рез1 = 1;
КонецЕсли;
Если Условие2 Истина Тогда
Рез2 = 1;
КонецЕсли;
Возврат Рез1*Рез2;
КонецФункции
7 Rie
 
17.09.09
10:15
(6) А параметрами функции - что является?
8 los_hooliganos
 
17.09.09
10:17
(7) Может быть массив битов?
9 Fragster
 
гуру
17.09.09
10:17
в (5) БитВ = БитА * БитБ;

а "или": БитВ = ?(БитА + БитБ = 0, 0, 1);
10 DenIv
 
17.09.09
10:19
(8) 65535 AND 255 как отработать?
11 Ёпрст
 
гуру
17.09.09
10:19
:)

Шелл = создатьобъект("MSScriptControl.ScriptControl");
Шелл.Language = "VBScript";
стрКод =
"function intAND(x, y)
|  intAND = x and y
|end function";
Шелл.AddCode(стрКод);
Шелл.Run("intXOR", число1, число2);
12 Rie
 
17.09.09
10:22
(10) В (5)
БитВ = БитА*БитБ;
13 DenIv
 
17.09.09
10:22
(9) модифицируй (5) если не затруднит, плз
14 Fragster
 
гуру
17.09.09
10:25
Функция XOR(Val ПарА, Val ПарБ)  Экспорт
   Рез = 0;
   К = 1;
   Для BitNumber = 1 По  8 Цикл - здесь 8 - максимальное количество бит
       БитА = ПарА % 2;
       БитБ = ПарБ % 2;
       ПарА = Цел(ПарА / 2);
       ПарБ = Цел(ПарБ / 2);
       БитВ = (БитА + БитБ) % 2; - это XOR
       БитВ = БитА * БитБ; - это AND
       БитВ = ?(БитА + БитБ = 0, 0, 1); - это OR
       Рез = Рез + БитВ * К;
       К = К * 2;
   КонецЦикла;  
   Возврат Рез;
КонецФункции
15 DenIv
 
17.09.09
10:26
Пасиб
16 DenIv
 
17.09.09
10:37
(14), если - здесь 8 - максимальное количество бит, то
НачСумма=L_AND(НачСумма, 65535) - не будет работать?
17 Fragster
 
гуру
17.09.09
10:37
(16) не будет
18 Fragster
 
гуру
17.09.09
10:38
Пока (парА>0) и (ПарБ>0) цикл
.........

будет
19 DenIv
 
17.09.09
11:14
Вообще задача шире, нужно считать CRC файла, делаю:
Функция Сдвиг(а,н,куда)
   Перем Ат;
   Ат=Pow(2,Цел(Log(а)/Log(2)))+1;
   Если Ат<65535 Тогда
       Ат=65535;
   КонецЕсли;
   Если куда=1 Тогда
       Возврат а/pow(2,н);
   Иначе
       Возврат а*pow(2,н)%Ат;
   КонецЕсли;
КонецФункции

Функция Расчет(Знач НачСумма,Сп,Массив)    
   Для к=0 По Сп.Количество()-1 Цикл
       а=L_AND(Сдвиг(НачСумма,8,1),255);
       б = XOR(Сдвиг(НачСумма,8,0) , Сдвиг(НачСумма,8,0));
       с = XOR(б,Сп[к]);
       НачСумма = Массив[XOR(а,с)+1];
       НачСумма=L_AND(НачСумма, 65535);
   КонецЦикла;
   Возврат НачСумма;
КонецФункции

//*******************************************

Функция глПолучитьКонтрольнуюСуммуФайла(ПолноеИмяФайла) Экспорт
   Перем Рез,Имя,Каталог;
   Перем Массив;
   Массив = Новый Массив(256);
   Массив[0]=0;
   Для к=1 По 255 Цикл
       Массив[к]=Массив[к-1]+4129;
   КонецЦикла;
   Рез=12504;
   ФСО=Новый ComОбъект("Scripting.FileSystemObject");
   Файл=ФСО.OpenTextFile(ПолноеИмяФайла);
   Сп=Новый СписокЗначений;
   Пока Файл.AtEndOfStream=0 Цикл
       Сп.Добавить(КодСимвола(Файл.Read(1)));
   КонецЦикла;
   Рез=Расчет(Рез,Сп,Массив);
   Возврат Рез;
КонецФункции

Алгоритм взят из v8: Как быстро посчитать CRC-файла, но что-то CRC сдается мне расчитывается не корректно, где ошибка?
20 Rie
 
17.09.09
11:30
(19) А логарифмы-то зачем? Двоичный логарифм проще делением посчитать.
21 DenIv
 
17.09.09
11:32
(19) да я ХЗ, говорю же алгоритм из v8: Как быстро посчитать CRC-файла
Закон Брукера: Даже маленькая практика стоит большой теории.