Заметки из Зазеркалья

07.07.2017

Побитовые операции с целыми числами

Данная статья является анонсом новой функциональности.
Не рекомендуется использовать содержание данной статьи для освоения новой функциональности.
Полное описание новой функциональности будет приведено в документации к соответствующей версии.
Полный список изменений в новой версии приводится в файле v8Update.htm.

Реализовано в версии 8.3.11.2867.

Мы развиваем средства работы с двоичными данными. Ранее мы рассказывали о том, что реализовали в платформе набор побитовых операций на уровне буферов двоичных данных. Эти функции являются довольно универсальными, что позволяет гибко использовать их для широкого круга задач.

Однако в простых и наиболее распространённых случаях такая универсальность оказывается не очень удобной. Поэтому мы добавили в платформу аналогичный по своему составу, но более лаконичный в использовании набор побитовых функций для работы с числами.

Прежде всего, это «стандартный» набор операций: ПобитовоеИ(), ПобитовоеИли(), ПобитовоеНе(), ПобитовоеИНе() и ПобитовоеИсключительноеИли(). Аргументы этих функций интерпретируются как 32-битные целые числа без знака. Результатом этих функций также является число, получаемое в результате побитового объединения аргументов по правилам выбранной логической операции.

Также мы добавили две операции сдвига: ПобитовыйСдвигВлево() и ПобитовыйСдвигВправо(). С их помощью вы можете сдвинуть двоичное представление числа на нужное количество битов, а освободившиеся разряды заполнить нулями.

Помимо этого мы реализовали функции, с помощью которых вы можете проверить состояние отдельного бита (ПроверитьБит()), проверить состояние сразу нескольких битов (ПроверитьПоБитовойМаске()), или установить отдельный бит числа в нужное вам значение (УстановитьБит()).

В качестве иллюстрации использования новых функций можно привести тот же самый пример, который мы демонстрировали по ссылке выше, когда рассказывали про побитовые операции с буфером двоичных данных. Теперь он будет выглядеть проще и понятнее:

Функция ДекодироватьСвойстваНоменклатуры(Свойства) МаскаНалоговаяСтавка = 7; // Получить код налоговой ставки. Значение налоговой ставки будет получено позже, // из справочника налоговых ставок по этому коду. НалоговаяСтавка = ПобитовоеИ(Свойства, МаскаНалоговаяСтавка); ШтучныйТовар = ПроверитьБит(Свойства, 3); РазрешитьПродажу = ПроверитьБит(Свойства, 4); РазрешитьПодсчетКоличества = ПроверитьБит(Свойства, 5); РазрешитьОдиночнуюПродажу = ПроверитьБит(Свойства, 6); Результат = Новый Структура(); Результат.Вставить("НалоговаяСтавка", НалоговаяСтавка); Результат.Вставить("ШтучныйТовар", ШтучныйТовар); Результат.Вставить("РазрешитьПродажу", РазрешитьПродажу); Результат.Вставить("РазрешитьПодсчетКоличества", РазрешитьПодсчетКоличества); Результат.Вставить("РазрешитьОдиночнуюПродажу", РазрешитьОдиночнуюПродажу); Возврат Результат; КонецФункции

Второй пример показывает, как узнать, что признаки товара (Свойства) соответствуют тем значениям, которые вы ожидаете (штучный товар, разрешенный к продаже).

Функция ПроверитьСвойстваТовара(Свойства) МаскаШтучныйТовар = 8; МаскаРазрешитьПродажу = 16; МаскаПодсчетКоличества = 32; МаскаОдиночнаяПродажа = 64; Возврат ПроверитьПоБитовойМаске(Свойства, МаскаШтучныйТовар + МаскаРазрешитьПродажу); КонецФункции

И, наконец, третий пример показывает ситуацию, в которой вам может понадобиться сдвиг на несколько битов.

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

Теги: разработка  8.3.11 

Рассказать друзьям: