CREATE PROCEDURE [dbo].[BitOR]
-- Add the parameters for the stored procedure here
@BigInt1 bigint,
@BigInt2 bigint
AS
BEGIN
SET NOCOUNT ON;
SELECT @BigInt1 | @BigInt2
END
Аналогично можно реализовать две оставшиеся операции. Теперь покажем как организовать вызов данных процедур из 1С. Для этого нам потребуется подключение к SQL серверу.
Функция глSQLПодключение() Экспорт
SQLConnect = Новый COMОбъект("ADODB.Connection");ConnectionString = "driver={SQL Server}; server=<Имя сервера>; uid=<Имя пользователя>; pwd=*******; DataBase=<Имя базы> ";SQLConnect.ConnectionTimeOut =600;SQLConnect.CursorLocation = 3;попыткаSQLConnect.Open(ConnectionString);исключениеSQLConnect="";Предупреждение("Невозможно установить соединение");возврат Неопределено;конецпопытки;возврат SQLConnect;
КонецФункцииПриведенная функция в случае успешного завершения возвращает com-объект, который позволяет выполнять команды на SQL сервере. Используя созданное подключение, мы можем вызвать хранимую процедуру. Ниже пример того, как это сделать из 1С.
Функция BitOr(вхЧсл1,вхЧсл2,вхSQLConnect)
CmdSQL = Новый COMОбъект("ADODB.Command") ;CmdSQL.ActiveConnection = вхSQLConnect ;CmdSQL.CommandText = "EXEC [dbo].[BitOr] "+Формат(вхЧсл1,"ЧН=0; ЧГ=0")+","+Формат(вхЧсл2,"ЧН=0; ЧГ=0");rs=CmdSQL.Execute();rs.MoveFirst();возврат rs.Fields(0).Value;
КонецФункцииТеперь поговорим о том, как получить текущее состояние кубика. В 1С реализованы длинное умножение и сложение, а длина данных, с которыми можно оперировать, определяется исключительно размером доступной памяти. Поэтому получить массив, в котором хранятся значения степеней двойки для значений показателя от 0 до 63, труда не составляет. Далее каждой точке с координатами x,y и z мы можем сопоставить число из диапазона 0...63. Это число рассчитывается по формуле z+4*(y+4*x). После этого, чтобы получить состояние,описывающее наш кубик, мы должны для каждой заполненной точки вычислить ее положение в одномерном массиве, найти значение двойки в данной степени и полученные числа сложить. Все просто и понятно. Но тип данных bigint хранит данные в диапазоне (-2^63) до (2^63-1), а значит при попытке передать в хранимую процедуру число 2^63 мы получим ошибку. Нам надо понять какому значению соответствует двоичная запись, которая содержит 0 во всех разрядах, кроме самого старшего. Для этого надо найти информацию о представлении в памяти целых отрицательных чисел. Это не сложно. Алгоритм следующий, надо взять двоичную запись положительного числа, инвертировать ее, то есть 0 заменить на 1, а 1 на 0, затем к получившемуся числу прибавить 1. Используя полученные сведения, найдем представление для (-1):
- Двоичная запись 1 - 0x000...001
- Инвертируем 0x111...110
- Прибавляем 1, получаем 0x111...111
Поиск решения заключается в переборе всех возможных вариантов исходных элементов. Для этого я предварительно подготовил таблицу состояний, в которой для каждой фигуры и каждого положения фигуры вычислил ее характеристику, как это описано выше. Затем в процедуре поиска, когда мне нужно было проверить можно ли разместить фигуру в кубике, я вычислял логическое И между текущим состоянием и характеристикой фигуры и если оно равнялось нулю, то фигуру можно было разместить. Поставить фигуру - вычислить логическое ИЛИ между текущим состоянием и характеристикой фигуры, снять фигуру - вычислить логическое ИСКЛЮЧАЮЩЕЕ ИЛИ между текущим состоянием и характеристикой фигуры. Разумеется, изложенную методику я реализовал, как дополнительную к более простой, когда состояние кубика описывалось трехмерным массивом.
Ну и ответ на вопрос, зачем это надо. Человеческий мозг содержит около 86 млрд. нейронов, но не это количество делает его поистине уникальным. Значительно важнее связи между нейронами, а вот здесь количество сочетаний становится просто астрономическим. Возможно, прочитав эту статью, у вас сложится неожиданная цепочка, которая впоследствии приведет к решению задачи, весьма далекой от изложенной.