4.5 Битовые операции
Octave предоставляет ряд функций для обработки числовых значений побитово. Основные функции для установки и получения значений отдельных битов — bitset и bitget.
- : B = bitset (A, n) ¶
- : B = 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.
- : b = 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 также включает основные побитовые операторы «и», «или» и «исключающее или».
- : z = bitand (x, y) ¶
-
Возвращает побитовую операцию И для неотрицательных целых чисел.
x, y должны быть в диапазоне [0, intmax]
См. также: bitor, bitxor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
- : z = bitor (x, y) ¶
-
Возвращает побитовую операцию ИЛИ для неотрицательных целых чисел x и y.
См. также: bitor, bitxor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
- : z = bitxor (x, y) ¶
-
Возвращает побитовую операцию ИСКЛЮЧАЮЩЕЕ ИЛИ для неотрицательных целых чисел x и y.
См. также: bitand, bitor, bitset, bitget, bitcmp, bitshift, intmax, flintmax.
Побитовый оператор «не» — это унарный оператор, который выполняет логическое отрицание каждого бита значения. Для этого необходимо определить маску, по отношению к которой выполняется отрицание. Побитовый оператор «не» в Octave — bitcmp.
- : C = 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 также включает возможность побитового сдвига влево и вправо.
- : B = bitshift (A, k) ¶
- : B = 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–2023 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/v8.1.0/Bit-Manipulations.html