Побитовые функции

Побитовые функции выполняют операции сдвига и вращения битов в целочисленных значениях.

Обзор функций

Функция

Параметры

Описание

Возвращает

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 позиций. Освободившиеся младшие биты заполняются нулями.

Пример:

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 позиций. Освободившиеся старшие биты заполняются нулями.

Пример:

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 позиций. Биты, «выпадающие» слева, появляются справа.

Пример:

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 позиций. Биты, «выпадающие» справа, появляются слева.

Пример:

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
        

Практические примеры

Инкапсуляция битовых флагов

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);
        

Быстрое умножение и деление на степень двойки

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 (целочисленное деление)
        

Примечание

  • Побитовые функции применяются только к целочисленным типам данных (BYTE, WORD, DWORD, SINT, INT, DINT и т.д.).

  • Параметр K (количество бит сдвига) обычно должен быть неотрицательным целым числом.

  • Поведение при сдвиге на количество бит, превышающее разрядность типа, может зависеть от реализации.

  • Операции сдвига могут использоваться для эффективного умножения и деления на степени двойки.

См. также

Встроенные типы данных - для информации о целочисленных типах данных. Операторы языка ST - для информации о побитовых операторах.