Побитовые операции NumPy
Побитовые операции — это класс операций, выполняемых на уровне битов двоичных чисел. Они непосредственно работают с отдельными битами двоичных чисел, не учитывая общее значение числа.
NumPy предоставляет ряд функций побитовых операций, которые позволяют выполнять побитовые операции над элементами массивов. Эти операции похожи на побитовые операторы Python, но они действуют на массивы NumPy, поддерживают векторизованную обработку и обеспечивают более высокую производительность.
Побитовые операции широко используются в информатике для оптимизации и обработки низкоуровневых данных.
NumPy bitwise_Функции, начинающиеся с "bitwise", являются функциями побитовых операций.
Побитовые операции NumPy включают следующие функции:
| Действие | Функция/Оператор | Описание |
|---|---|---|
| Побитовое И | numpy.bitwise_and(x1, x2) | Выполняет побитовую операцию AND над каждым элементом массива. |
| Побитовое ИЛИ | numpy.bitwise_or(x1, x2) | Выполняет побитовую операцию OR над каждым элементом массива. |
| Побитовое XOR | numpy.bitwise_xor(x1, x2) | Выполняет побитовую операцию XOR над каждым элементом массива. |
| Побитовое НЕ | numpy.invert(x) | Выполняет побитовую операцию NOT над каждым элементом массива. |
| Сдвиг влево | numpy.left_shift(x1, x2) | Сдвигает каждый элемент массива влево на указанное число битов. |
| Сдвиг вправо | numpy.right_shift(x1, x2) | Сдвигает каждый элемент массива вправо на указанное количество битов. |
Пример
arr1 = np.array([True, False, True], dtype=bool)
arr2 = np.array([False, True, False], dtype=bool)
result_and = np.bitwise_and(arr1, arr2)
result_or = np.bitwise_or(arr1, arr2)
result_xor = np.bitwise_xor(arr1, arr2)
result_not = np.bitwise_not(arr1)
print("AND:", result_and) # [False, False, False]
print("OR:", result_or) # [True, True, True]
print("XOR:", result_xor) # [True, True, True]
print("НЕ:", result_not) # [False, True, False]
# Побитовое НЕ
arr_invert = np.invert(np.array([1, 2], dtype=np.int8))
print("Инверсия:", arr_invert) # [-2, -3]
# Операция сдвига влево
arr_left_shift = np.left_shift(5, 2)
print("Сдвиг влево:", arr_left_shift) # 20
# Операция сдвига вправо
arr_right_shift = np.right_shift(10, 1)
print("Сдвиг вправо:", arr_right_shift) # 5
Вы также можете использовать"&", "~", "|" и "^"и другие операторы для выполнения вычислений:
Операция И (&):Когда оба разряда в соответствующих битах равны 1, результат равен 1; в противном случае результат равен 0.
Например: 1010 & 1100 = 1000
Операция OR (|):Когда хотя бы одна из двух цифр в соответствующих битах равна 1, результат равен 1; в противном случае результат равен 0.
Например: 1010 | 1100 = 1110
Операция XOR (^):Когда две цифры в соответствующих битах различаются, результат равен 1; когда они совпадают, результат равен 0.
Например: 1010 ^ 1100 = 0110
Операция NOT (~):Инвертировать каждый бит числа, то есть 0 становится 1, а 1 становится 0.
Например: ~1010 = 0101
Операция сдвига влево (<<):Сдвинуть все биты числа влево на указанное количество бит, заполняя правую сторону нулями.
Например: 1010 << 2 = 101000
Операция сдвига вправо (>>):Сдвинуть все биты числа вправо на указанное количество бит, заполняя левую сторону в соответствии со знаковым битом или нулями.
Например: 1010 >> 2 = 0010
bitwise_and
Функция bitwise_and() выполняет побитовую операцию И над двоичной формой целых чисел в массиве.
Пример
Результат вывода:
13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位与: 1
Приведённый выше пример можно проиллюстрировать следующей таблицей:
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| AND | |||||
| 1 | 0 | 0 | 0 | 1 | |
| Результат операции | 0 | 0 | 0 | 0 | 1 |
Правила побитовой операции И таковы:
| A | B | AND |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
bitwise_or
Функция bitwise_or() выполняет побитовую операцию ИЛИ над двоичной формой целых чисел в массиве.
Пример
Результат вывода:
13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位或: 29
Приведённый выше пример можно проиллюстрировать следующей таблицей:
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| OR | |||||
| 1 | 0 | 0 | 0 | 1 | |
| Результат операции | 1 | 1 | 1 | 0 | 1 |
Правила операции побитового ИЛИ таковы:
| A | B | OR |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
invert
Функция invert() выполняет побитовую операцию НЕ над целыми числами в массиве, то есть 0 становится 1, а 1 становится 0.
Для знаковых целых чисел возьмите дополнение двоичного числа, затем прибавьте 1. В двоичном числе старший бит, равный 0, обозначает положительное число, а старший бит, равный 1, — отрицательное число.
Рассмотрим шаги вычисления ~1:
- будет
1(Это называется: прямой код) Преобразовать в двоичный код =00000001 - Побитовая инверсия =
11111110 - Мы видим, что знаковый бит (т. е. старший бит) равен
1(указывает на отрицательное число), инвертировать остальные разряды, кроме знакового бита =10000001 - Прибавить 1 к последнему биту, чтобы получить его дополнение =
10000010 - Преобразовать обратно в десятичную систему =
-2
| Выражение | Двоичное значение (дополнительный код) | Десятичное значение |
|---|---|---|
| 5 | 00000000 00000000 00000000 00000101 | 5 |
| ~5 | 11111111 11111111 11111111 11111010 | -6 |
Пример
Результат вывода:
13 的位反转,其中 ndarray 的 dtype 是 uint8: [242] 13 的二进制表示: 00001101 242 的二进制表示: 11110010
left_shift
Функция left_shift() сдвигает двоичную форму элементов массива влево на указанное число позиций, добавляя справа такое же количество 0.
Пример
Результат вывода:
将 10 左移两位: 40 10 的二进制表示: 00001010 40 的二进制表示: 00101000
right_shift
Функция right_shift() сдвигает двоичную форму элементов массива вправо на указанное количество позиций, добавляя такое же количество нулей слева.
Пример
Результат вывода:
将 40 右移两位: 10 40 的二进制表示: 00101000 10 的二进制表示: 00001010Другие расширения