Глобальный контекст.ПобитовоеИли

Методы · BitwiseOr

Возвращает результат логической побитовой операции ИЛИ для заданной пары чисел.

Синтаксис

ПобитовоеИли(<Число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. Сдвиги и маски разделяют поля без строковых преобразований.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.


МладшееПоле = 52;
СтаршееПоле = 18;
Если МладшееПоле < 0 Или МладшееПоле > 255 Или МладшееПоле <> Цел(МладшееПоле)
    Или СтаршееПоле < 0 Или СтаршееПоле > 255 Или СтаршееПоле <> Цел(СтаршееПоле) Тогда
    ВызватьИсключение "Учебные поля должны быть целыми числами 0..255";
КонецЕсли;
Упаковано = ПобитовоеИли(МладшееПоле, ПобитовыйСдвигВлево(СтаршееПоле, 8));
Первое = ПобитовоеИ(Упаковано, 255);
Второе = ПобитовоеИ(ПобитовыйСдвигВправо(Упаковано, 8), 255);
Если Упаковано <> 4660 Или Первое <> 52 Или Второе <> 18 Тогда
    ВызватьИсключение "Нарушена упаковка двух учебных полей";
КонецЕсли;
Сообщить(СтрШаблон("Число %1; младшее %2; старшее %3", Упаковано, Первое, Второе));

Разбор по шагам

  1. Каждое поле проверяем как целое 0…255, иначе оно не помещается в 8 бит.

  2. Сдвиг старшего поля на 8 бит освобождает младший байт; Или объединяет непересекающиеся области.

  3. Маска 255 оставляет только восемь младших битов. Для старшего поля сначала сдвигаем число вправо.

  4. Это порядок разрядов в числе. При записи в двоичный поток порядок байтов нужно задать отдельно.

Как проверить результат

  1. Результат: число 4660, младшее поле 52, старшее 18.

  2. Замените любое поле на 256 или 1.5: исключение возникает до упаковки.

  3. Для другого допустимого набора сначала обновите ожидаемые значения в проверке, затем сравните распакованные поля с исходными.

Ожидаемый результат

Два фиксированных 8-битных поля объединены и восстановлены без потери значений.

На что обратить внимание

  1. ПобитовыйСдвигВправо заполняет освободившиеся старшие разряды нулями; это не деление дробного значения.

  2. Числовая упаковка не определяет сетевой протокол и endian-порядок сериализованных байтов.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Хранить учебные признаки товара в битовой маске

Бит 0 означает Активен, бит 1 — ЕстьФото, бит 2 — ЕстьОписание. Устанавливаем, проверяем и снимаем флаги на фиксированном числе.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Весь пример выполняется на числах, строках и двоичных данных, созданных в памяти. Реальные файлы, API и объекты базы не нужны.


Активен = 1;
ЕстьФото = 2;
ЕстьОписание = 4;
Флаги = ПобитовоеИли(Активен, ЕстьФото);
Флаги = УстановитьБит(Флаги, 2, Истина);
Сообщить(Флаги);
Сообщить(ПроверитьБит(Флаги, 0));
Сообщить(ПроверитьПоБитовойМаске(Флаги, ПобитовоеИли(ЕстьФото, ЕстьОписание)));
БезФото = УстановитьБит(Флаги, 1, Ложь);
БезФотоЧерезМаску = ПобитовоеИНе(Флаги, ЕстьФото);
Сообщить(БезФото = 5 И БезФото = БезФотоЧерезМаску);
Сообщить(ПобитовоеИ(БезФото, ЕстьФото) = 0);
ПереключённыйФото = ПобитовоеИсключительноеИли(БезФото, ЕстьФото);
Сообщить(ПереключённыйФото = 7);
Сообщить(ПобитовоеИсключительноеИли(ПереключённыйФото, ЕстьФото) = 5);
Сообщить(ПобитовоеНе(0) = 4294967295);
Сообщить(ПобитовоеИ(ПобитовоеНе(ЕстьФото), 7) = 5);

Разбор по шагам

  1. Номера битов начинаются с 0. Маска 1 соответствует биту 0, 2 — биту 1, 4 — биту 2.

  2. Или объединяет флаги; ПроверитьБит проверяет один номер бита, ПроверитьПоБитовойМаске — наличие всех битов маски.

  3. УстановитьБит возвращает новое число. Чтобы сохранить изменение, присваиваем результат; переменная не изменяется сама.

  4. ИсключительноеИли переключает флаг, ИНе снимает биты маски. Не инвертирует все 32 бита, поэтому результат ограничиваем маской 7.

Как проверить результат

  1. Первое сообщение 7; все последующие контрольные сравнения дают Истина.

  2. После снятия Фото получается 5: активность и описание сохранились.

  3. Повторное XOR-переключение тем же флагом возвращает исходное значение 5.

Ожидаемый результат

Освоены битовые операции на трёх явно определённых учебных признаках.

На что обратить внимание

  1. Это не реальные значения статусов Avito и не система прав 1С: контракт признаков задан только для упражнения.

  2. API принимает целые числа 0…4294967295 и номера битов 0…31; отрицательные числа и дроби не подходят.

  3. ПобитовоеНе — не логическое Не для Булево. Инверсия числа затрагивает также старшие биты.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.