Возвращает результат логической побитовой операции ИЛИ для заданной пары чисел.
Синтаксис
ПобитовоеИли(<Число1>, <Число2>)Полное описание, параметры и ограничения
Глобальный контекст.ПобитовоеИли (Global context.BitwiseOr)
Глобальный контекст (Global context)
ПобитовоеИли (BitwiseOr)
Доступен, начиная с версии 8.3.11.
Синтаксис:
ПобитовоеИли(<Число1>, <Число2>)
Параметры:
<Число1> (обязательный)
Тип: Число.
Первый операнд побитовой операции.
Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение.
<Число2> (обязательный)
Тип: Число.
Второй операнд побитовой операции.
Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение.
Возвращаемое значение:
Тип: Число.
Описание:
Возвращает результат логической побитовой операции ИЛИ для заданной пары чисел.
Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.11.
Методическая информация
Практические примеры
Упаковать два байтовых поля в число и распаковать обратно
Младшее поле 52 и старшее 18 объединяем в 16-битное число 4660. Сдвиги и маски разделяют поля без строковых преобразований.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.
МладшееПоле = 52;
СтаршееПоле = 18;
Если МладшееПоле < 0 Или МладшееПоле > 255 Или МладшееПоле <> Цел(МладшееПоле)
Или СтаршееПоле < 0 Или СтаршееПоле > 255 Или СтаршееПоле <> Цел(СтаршееПоле) Тогда
ВызватьИсключение "Учебные поля должны быть целыми числами 0..255";
КонецЕсли;
Упаковано = ПобитовоеИли(МладшееПоле, ПобитовыйСдвигВлево(СтаршееПоле, 8));
Первое = ПобитовоеИ(Упаковано, 255);
Второе = ПобитовоеИ(ПобитовыйСдвигВправо(Упаковано, 8), 255);
Если Упаковано <> 4660 Или Первое <> 52 Или Второе <> 18 Тогда
ВызватьИсключение "Нарушена упаковка двух учебных полей";
КонецЕсли;
Сообщить(СтрШаблон("Число %1; младшее %2; старшее %3", Упаковано, Первое, Второе));Разбор по шагам
Каждое поле проверяем как целое 0…255, иначе оно не помещается в 8 бит.
Сдвиг старшего поля на 8 бит освобождает младший байт; Или объединяет непересекающиеся области.
Маска 255 оставляет только восемь младших битов. Для старшего поля сначала сдвигаем число вправо.
Это порядок разрядов в числе. При записи в двоичный поток порядок байтов нужно задать отдельно.
Как проверить результат
Результат: число 4660, младшее поле 52, старшее 18.
Замените любое поле на 256 или 1.5: исключение возникает до упаковки.
Для другого допустимого набора сначала обновите ожидаемые значения в проверке, затем сравните распакованные поля с исходными.
Ожидаемый результат
Два фиксированных 8-битных поля объединены и восстановлены без потери значений.
На что обратить внимание
ПобитовыйСдвигВправо заполняет освободившиеся старшие разряды нулями; это не деление дробного значения.
Числовая упаковка не определяет сетевой протокол и endian-порядок сериализованных байтов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Хранить учебные признаки товара в битовой маске
Бит 0 означает Активен, бит 1 — ЕстьФото, бит 2 — ЕстьОписание. Устанавливаем, проверяем и снимаем флаги на фиксированном числе.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.
Активен = 1;
ЕстьФото = 2;
ЕстьОписание = 4;
Флаги = ПобитовоеИли(Активен, ЕстьФото);
Флаги = УстановитьБит(Флаги, 2, Истина);
Сообщить(Флаги);
Сообщить(ПроверитьБит(Флаги, 0));
Сообщить(ПроверитьПоБитовойМаске(Флаги, ПобитовоеИли(ЕстьФото, ЕстьОписание)));
БезФото = УстановитьБит(Флаги, 1, Ложь);
БезФотоЧерезМаску = ПобитовоеИНе(Флаги, ЕстьФото);
Сообщить(БезФото = 5 И БезФото = БезФотоЧерезМаску);
Сообщить(ПобитовоеИ(БезФото, ЕстьФото) = 0);
ПереключённыйФото = ПобитовоеИсключительноеИли(БезФото, ЕстьФото);
Сообщить(ПереключённыйФото = 7);
Сообщить(ПобитовоеИсключительноеИли(ПереключённыйФото, ЕстьФото) = 5);
Сообщить(ПобитовоеНе(0) = 4294967295);
Сообщить(ПобитовоеИ(ПобитовоеНе(ЕстьФото), 7) = 5);Разбор по шагам
Номера битов начинаются с 0. Маска 1 соответствует биту 0, 2 — биту 1, 4 — биту 2.
Или объединяет флаги; ПроверитьБит проверяет один номер бита, ПроверитьПоБитовойМаске — наличие всех битов маски.
УстановитьБит возвращает новое число. Чтобы сохранить изменение, присваиваем результат; переменная не изменяется сама.
ИсключительноеИли переключает флаг, ИНе снимает биты маски. Не инвертирует все 32 бита, поэтому результат ограничиваем маской 7.
Как проверить результат
Первое сообщение 7; все последующие контрольные сравнения дают Истина.
После снятия Фото получается 5: активность и описание сохранились.
Повторное XOR-переключение тем же флагом возвращает исходное значение 5.
Ожидаемый результат
Освоены битовые операции на трёх явно определённых учебных признаках.
На что обратить внимание
Это не реальные значения статусов Avito и не система прав 1С: контракт признаков задан только для упражнения.
API принимает целые числа 0…4294967295 и номера битов 0…31; отрицательные числа и дроби не подходят.
ПобитовоеНе — не логическое Не для Булево. Инверсия числа затрагивает также старшие биты.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.