***************** Побитовые функции ***************** Побитовые функции выполняют операции сдвига и вращения битов в целочисленных значениях. .. _bitwise-functions-overview: Обзор функций ============= .. list-table:: :header-rows: 1 :widths: 30, 30, 40, 15 * - Функция - Параметры - Описание - Возвращает * - ``SHL(in, K)`` - ``in``: целочисленный тип, ``K``: целочисленный тип - Поразрядный сдвиг влево на ``K`` бит (заполнение нулями справа) - Тот же тип, что и ``in`` * - ``SHR(in, K)`` - ``in``: целочисленный тип, ``K``: целочисленный тип - Поразрядный сдвиг вправо на ``K`` бит (заполнение нулями слева) - Тот же тип, что и ``in`` * - ``ROL(in, K)`` - ``in``: целочисленный тип, ``K``: целочисленный тип - Циклический сдвиг влево на ``K`` бит - Тот же тип, что и ``in`` * - ``ROR(in, K)`` - ``in``: целочисленный тип, ``K``: целочисленный тип - Циклический сдвиг вправо на ``K`` бит - Тот же тип, что и ``in`` SHL — Сдвиг влево ================= Сдвигает биты значения ``in`` влево на ``K`` позиций. Освободившиеся младшие биты заполняются нулями. **Пример:** .. code-table:: VAR value : BYTE := 2#00000101; // 5 в двоичной системе result : BYTE; END_VAR result := SHL(value, 2); // result = 2#00010100 (20) // Пояснение: // 00000101 << 2 = 00010100 (5 * 2^2 = 5 * 4 = 20) SHR — Сдвиг вправо ================== Сдвигает биты значения ``in`` вправо на ``K`` позиций. Освободившиеся старшие биты заполняются нулями. **Пример:** .. code-table:: VAR value : BYTE := 2#00010100; // 20 в двоичной системе result : BYTE; END_VAR result := SHR(value, 2); // result = 2#00000101 (5) // Пояснение: // 00010100 >> 2 = 00000101 (20 / 2^2 = 20 / 4 = 5) ROL — Циклический сдвиг влево ============================= Сдвигает биты значения ``in`` влево на ``K`` позиций. Биты, "выпадающие" слева, появляются справа. **Пример:** .. code-table:: VAR value : BYTE := 2#10001111; // 143 в двоичной системе result : BYTE; END_VAR result := ROL(value, 2); // result = 2#00111110 (62) // Пояснение: // 10001111 << 2 = 00111100, биты выпавшие слева: 10 // 00111100 + 10 = 00111110 ROR — Циклический сдвиг вправо ============================== Сдвигает биты значения ``in`` вправо на ``K`` позиций. Биты, "выпадающие" справа, появляются слева. **Пример:** .. code-table:: VAR value : BYTE := 2#10001111; // 143 в двоичной системе result : BYTE; END_VAR result := ROR(value, 2); // result = 2#11100011 (227) // Пояснение: // 10001111 >> 2 = 00100011, биты выпавшие справа: 11 // 11000000 + 00100011 = 11100011 Практические примеры ==================== **Инкапсуляция битовых флагов** .. code-table:: VAR status : BYTE := 0; // Хранит 8 флагов flag_bit : INT := 3; // Устанавливаем бит 3 END_VAR // Установка бита status := status OR SHL(1, flag_bit); // Проверка бита IF (status AND SHL(1, flag_bit)) <> 0 THEN // Бит установлен END_IF; // Сброс бита status := status AND NOT SHL(1, flag_bit); **Быстрое умножение и деление на степень двойки** .. code-table:: VAR value : INT := 5; result : INT; END_VAR // Умножение на 4 (2^2) result := SHL(value, 2); // result = 20 // Деление на 4 (2^2) result := SHR(value, 2); // result = 1 (целочисленное деление) .. note:: * Побитовые функции применяются только к целочисленным типам данных (``BYTE``, ``WORD``, ``DWORD``, ``SINT``, ``INT``, ``DINT`` и т.д.). * Параметр ``K`` (количество бит сдвига) обычно должен быть неотрицательным целым числом. * Поведение при сдвиге на количество бит, превышающее разрядность типа, может зависеть от реализации. * Операции сдвига могут использоваться для эффективного умножения и деления на степени двойки. .. seealso:: :doc:`data_types` - для информации о целочисленных типах данных. :doc:`operators` - для информации о побитовых операторах.