4.5 Битовые операции
Octave предоставляет ряд функций для манипулирования числовыми значениями побитово. Основные функции для установки и получения значений отдельных битов — это bitset и bitget.
- C = bitset (A, n)
- C = bitset (A, n, val)
-
Установка или сброс бита(ов) n для целых беззнаковых чисел в A.
Наименее значимый бит имеет n = 1. val = 0 сбрасывает биты, а val = 1 устанавливает биты. Если val не указан, он по умолчанию равен 1 (установка бита). Все входные данные должны иметь одинаковый размер или быть скалярными.
Пример 1: Установка нескольких битов
x = bitset (1, 3:5) ⇒ x = 5 9 17 dec2bin (x) ⇒ 00101 01001 10001Пример 2: Сброс и установка битов
x = bitset ([15 14], 1, [0 1]) ⇒ x = 14 15
См. также: bitand, bitor, bitxor, bitget, bitcmp, bitshift, intmax, flintmax.
- c = bitget (A, n)
-
Возвращает состояние бита(ов) n для целых беззнаковых чисел в A.
Наименее значимый бит имеет n = 1.
bitget (100, 8:-1:1) ⇒ 0 1 1 0 0 1 0 0
См. также: bitand, bitor, bitxor, bitset, bitcmp, bitshift, intmax, flintmax.
Аргументы всех побитовых операций Octave могут быть скалярными или массивами, за исключением bitcmp, где аргумент k должен быть скалярным. В случае, если более одного аргумента является массивом, все аргументы должны иметь одинаковую форму, и побитовая операция применяется к каждому элементу аргумента по отдельности. Если хотя бы один аргумент является скаляром, а другой — массивом, скалярный аргумент дублируется. Следовательно
bitget (100, 8:-1:1)
эквивалентно
bitget (100 * ones (1, 8), 8:-1:1)
Следует отметить, что все значения, передаваемые функциям побитовой обработки Octave, рассматриваются как целые числа. Таким образом, даже если в примере для bitset выше передаётся значение с плавающей точкой 10, оно обрабатывается как биты [1, 0, 1, 0], а не как биты представления числа с плавающей точкой 10.
Поскольку максимальное значение, которое может быть представлено числом, имеет важное значение для побитовой обработки, особенно при формировании масок, Octave предоставляет две вспомогательные функции: flintmax для целых чисел с плавающей точкой и intmax для целочисленных объектов (uint8, int64 и т. д.).
Octave также включает основные побитовые операторы «и», «или» и «исключающее или».
- bitand (x, y)
-
Возвращает побитовую операцию «и» для неотрицательных целых чисел.
x, y должны находиться в диапазоне [0, intmax]
См. также: bitor, bitxor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
- bitor (x, y)
-
Возвращает побитовую операцию «или» для неотрицательных целых чисел x и y.
См. также: bitor, bitxor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
- bitxor (x, y)
-
Возвращает побитовую операцию «исключающее или» для неотрицательных целых чисел x и y.
См. также: bitand, bitor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
Побитовый оператор «не» — это унарный оператор, который выполняет логическое отрицание каждого бита значения. Для этого необходимо определить маску, относительно которой происходит отрицание. Побитовый оператор «не» в Octave — это bitcmp.
- bitcmp (A, k)
-
Возвращает k-битовое дополнение целых чисел в A.
Если k опущено, используется значение по умолчанию
k = log2 (flintmax) + 1.bitcmp (7,4) ⇒ 8 dec2bin (11) ⇒ 1011 dec2bin (bitcmp (11, 6)) ⇒ 110100
См. также: bitand, bitor, bitxor, bitset, bitget, bitcmp, bitshift, flintmax.
Octave также предоставляет возможность побитового сдвига влево и вправо.
- bitshift (a, k)
- bitshift (a, k, n)
-
Возвращает сдвиг бита k беззнаковых целых чисел n-разрядности в a.
Положительное значение k приводит к сдвигу влево; отрицательное значение — к сдвигу вправо.
Если n опущено, оно по умолчанию равно 64. n должно быть в диапазоне [1,64].
bitshift (eye (3), 1) ⇒ 2 0 0 0 2 0 0 0 2 bitshift (10, [-2, -1, 0, 1, 2]) ⇒ 2 5 10 20 40
См. также: bitand, bitor, bitxor, bitset, bitget, bitcmp, intmax, flintmax.
Биты, сдвинутые за пределы значения с обоих концов, теряются. Octave также использует арифметические сдвиги, где бит знака значения сохраняется во время сдвига вправо. Например:
bitshift (-10, -1) ⇒ -5 bitshift (int8 (-1), -1) ⇒ -1
Обратите внимание, что bitshift (int8 (-1), -1) является -1, так как двоичное представление -1 в типе данных int8 равно [1, 1,
1, 1, 1, 1, 1, 1].
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v5.2.0/Bit-Manipulations.html