Глобальный контекст.ПобитовыйСдвигВправо

Методы · BitwiseShiftRight

Выполняет побитовый сдвиг двоичного представления числа на заданное количество битов вправо.

Синтаксис

ПобитовыйСдвигВправо(<Число>, <Смещение>)

Примеры платформы

Функция ПолучитьНалоговуюСтавку(Свойства)
   МаскаНалоговаяСтавка = ЧислоИзДвоичнойСтроки
            ("0b00000000001111000000000000000000");
   НалоговаяСтавка = ПобитовоеИ(Свойства,
            МаскаНалоговаяСтавка);
   Возврат ПобитовыйСдвигВправо(НалоговаяСтавка, 18);
КонецФункции
Полное описание, параметры и ограничения

Глобальный контекст.ПобитовыйСдвигВправо (Global context.BitwiseShiftRight)

Глобальный контекст (Global context)

ПобитовыйСдвигВправо (BitwiseShiftRight)

Доступен, начиная с версии 8.3.11.

Синтаксис:
ПобитовыйСдвигВправо(<Число>, <Смещение>)
Параметры:

<Число> (обязательный)
Тип: Число.
Число, для которого требуется выполнить сдвиг.
Значение должно быть целым числом в диапазоне от 0 до 2^32-1. Если число не целое или не укладывается в данный диапазон - генерируется исключение.

<Смещение> (обязательный)
Тип: Число.
Количество битов, на которое требуется выполнить сдвиг.
Значение должно быть целым числом в диапазоне от 0 до 31. Если число не целое или не укладывается в данный диапазон, будет сгенерировано исключение.
Возвращаемое значение:
Тип: Число.
Итоговое число после сдвига.
Описание:

Выполняет побитовый сдвиг двоичного представления числа на заданное количество битов вправо.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер, интеграция.

Примечание:
Освободившиеся разряды заполняются нулями.
Пример:

Функция ПолучитьНалоговуюСтавку(Свойства)
МаскаНалоговаяСтавка = ЧислоИзДвоичнойСтроки
("0b00000000001111000000000000000000");
НалоговаяСтавка = ПобитовоеИ(Свойства,
МаскаНалоговаяСтавка);
Возврат ПобитовыйСдвигВправо(НалоговаяСтавка, 18);
КонецФункции

Использование в версии:

Доступен, начиная с версии 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-порядок сериализованных байтов.

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

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

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

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

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