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/v9.2.0/Bit-Manipulations.html