Работа с группами, битовые маски

Материал из BiTel WiKi

Перейти к: навигация, поиск

Очень часто возникает проблема с тем, что необходимо фильтровать договора по группам, в новом модуле GOROD тоже необходимо считать маску договора http://bgbilling.ru/v5.2/doc/ch04s02.html

#Чтобы узнать коды параметров "Адрес" и "Полное имя" откройте справочник "Параметры договоров"
#и выберите коды из левого столбца. Параметр "Полное имя" должен быть в договоре обязательно, 
#а адреса может не быть - в этом случае подставится значение по умолчанию.
param.address=<код параметра адрес> 
param.fullname=<код параметра "Полное имя"> 
#это будет подставлено в адрес по умолчанию ${cid} - код договора
default.address=Уфа,ДС,0,${cid}
#битовая маска групп для которых выгружаются реестры. Определяется следующим образом: откройте справочник групп, 
#выделите позиции групп, начинающиеся с 0. Затем посчитайте выражение mask = 1<<gr1 | 1<<gr2...| 1<<grN
group.mask=262144
#счёт подставляемый в файл реестра для тега с кодом 1 (Код тега можно узнать на вкладке Теги в модуле Город)
account.1=175
#счёт подставляемый для договора с группой по маске 3 (т.е для договоров где (gr&3)>0)
#если счёт по группе договора не найден, используется счёт по фирме
account.gr.3=176

Одна из участниц форума начала настраивать и встал вопрос о том как же посчитать

#Затем посчитайте выражение mask = 1<<gr1 | 1<<gr2...| 1<<grN

Эту формулу. У меня так же возник вопрос (который я хотел давно разобрать) как же делать sql запрос, чтобы выбирать договора по определенным группам

gr&(1<<5)>0 AND gr&(1<<25)=0

Для первого Пример высчитывания от разработчиков. Есть группы группы id = 25, 26, 30, 31, 32, 33 высчитывается по такой формуле

mask = ( 1 << 25 ) | ( 1 << 26 ) | ( 1 << 30 ) | ( 1 << 31 ) | ( 1 << 32 ) | ( 1 << 33 ) = 1 * 2^25 + 1 * 2^26 + 1 * 2^30 + 1 * 2^31 + 1 * 2^32 + 1 * 2^33 = большое число типа long
Формула m << n в двоичной арифметике означает, что число m нужно умножить на 2 в степени n. 
А операция | эквивалентна сложению.

Для более подобного понимания рассмотрю пример ниже. Собственно << - это означает смещение байтов. Тоесть 1 в двоичной системе счисления будет равно 000001 и выражение 1<<5 будет равно 100000 (Тоесть сначала что сдвигаем, потом на сколько). Выражение gr&(1<<5)>0 высчитывается так: gr - это номер группы (начинается с нуля) потом переводится в двоичный вид (любой калькулятор в ОС это умеет делать) & означает побайтное И. Например в sql запросе

SELECT title, gr FROM contract

В gr вышла цифра 29, переводим ее в двоичную систему - получаем 011101, выражение gr&(1<<5)>0 принимает вид 011101&(100000)>0. Вычисляем

011101
100000
======
000000

0>0 тоесть false --- это значит что договор не принадлежит к группе 5

а вообще, самое просто - это брать договор, ставить у него нужные группы, потом делать sql запрос SELECT title, gr FROM contract where id = 23800 и смотреть цифры группы

--Skyb 01:37, 1 сентября 2011 (UTC)

Личные инструменты