Побитовые функции
Побитовые функции выполняют операции сдвига и вращения битов в целочисленных значениях.
Обзор функций
Функция |
Параметры |
Описание |
Возвращает |
|---|---|---|---|
|
|
Поразрядный сдвиг влево на |
Тот же тип, что и |
|
|
Поразрядный сдвиг вправо на |
Тот же тип, что и |
|
|
Циклический сдвиг влево на |
Тот же тип, что и |
|
|
Циклический сдвиг вправо на |
Тот же тип, что и |
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 - для информации о побитовых операторах.