Побитовые операции NumPy

Побитовые операции — это класс операций, выполняемых на уровне битов двоичных чисел. Они непосредственно работают с отдельными битами двоичных чисел, не учитывая общее значение числа.

NumPy предоставляет ряд функций побитовых операций, которые позволяют выполнять побитовые операции над элементами массивов. Эти операции похожи на побитовые операторы Python, но они действуют на массивы NumPy, поддерживают векторизованную обработку и обеспечивают более высокую производительность.

Побитовые операции широко используются в информатике для оптимизации и обработки низкоуровневых данных.

NumPy bitwise_Функции, начинающиеся с "bitwise", являются функциями побитовых операций.

Побитовые операции NumPy включают следующие функции:

ДействиеФункция/ОператорОписание
Побитовое Иnumpy.bitwise_and(x1, x2)Выполняет побитовую операцию AND над каждым элементом массива.
Побитовое ИЛИnumpy.bitwise_or(x1, x2)Выполняет побитовую операцию OR над каждым элементом массива.
Побитовое XORnumpy.bitwise_xor(x1, x2)Выполняет побитовую операцию XOR над каждым элементом массива.
Побитовое НЕnumpy.invert(x)Выполняет побитовую операцию NOT над каждым элементом массива.
Сдвиг влевоnumpy.left_shift(x1, x2)Сдвигает каждый элемент массива влево на указанное число битов.
Сдвиг вправоnumpy.right_shift(x1, x2)Сдвигает каждый элемент массива вправо на указанное количество битов.

Пример

import numpy as np

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, результат равен 1; в противном случае результат равен 0.

    Например: 1010 & 1100 = 1000

  2. Операция OR (|):Когда хотя бы одна из двух цифр в соответствующих битах равна 1, результат равен 1; в противном случае результат равен 0.

    Например: 1010 | 1100 = 1110

  3. Операция XOR (^):Когда две цифры в соответствующих битах различаются, результат равен 1; когда они совпадают, результат равен 0.

    Например: 1010 ^ 1100 = 0110

  4. Операция NOT (~):Инвертировать каждый бит числа, то есть 0 становится 1, а 1 становится 0.

    Например: ~1010 = 0101

  5. Операция сдвига влево (<<):Сдвинуть все биты числа влево на указанное количество бит, заполняя правую сторону нулями.

    Например: 1010 << 2 = 101000

  6. Операция сдвига вправо (>>):Сдвинуть все биты числа вправо на указанное количество бит, заполняя левую сторону в соответствии со знаковым битом или нулями.

    Например: 1010 >> 2 = 0010

bitwise_and

Функция bitwise_and() выполняет побитовую операцию И над двоичной формой целых чисел в массиве.

Пример

import numpy as np print ('Двоичная форма 13 и 17:') a,b = 13,17 print (bin(a), bin(b)) print ('\n') print ('Побитовое И чисел 13 и 17:') print (np.bitwise_and(13, 17))

Результат вывода:

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() выполняет побитовую операцию ИЛИ над двоичной формой целых чисел в массиве.

Пример

import numpy as np a,b = 13,17 print ('Двоичная форма 13 и 17:') print (bin(a), bin(b)) print ('Побитовое ИЛИ чисел 13 и 17:') print (np.bitwise_or(13, 17))

Результат вывода:

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 000001015
    ~511111111 11111111 11111111 11111010 -6

Пример

import numpy as np print ('Побитовая инверсия 13, где dtype ndarray равен uint8:') print (np.invert(np.array([13], dtype = np.uint8))) print ('\n') # Сравнивая двоичные представления 13 и 242, можно увидеть побитовую инверсию print ('Двоичное представление 13:') print (np.binary_repr(13, width = 8)) print ('\n') print ('Двоичное представление 242:') print (np.binary_repr(242, width = 8))

Результат вывода:

13 的位反转,其中 ndarray 的 dtype 是 uint8:
[242]


13 的二进制表示:
00001101


242 的二进制表示:
11110010

left_shift

Функция left_shift() сдвигает двоичную форму элементов массива влево на указанное число позиций, добавляя справа такое же количество 0.

Пример

import numpy as np print ('Сдвиньте 10 влево на два бита:') print (np.left_shift(10,2)) print ('\n') print ('Двоичное представление числа 10:') print (np.binary_repr(10, width = 8)) print ('\n') print ('Двоичное представление числа 40:') print (np.binary_repr(40, width = 8)) # Два бита в '00001010' сдвинулись влево, а два нуля добавились справа.

Результат вывода:

将 10 左移两位:
40


10 的二进制表示:
00001010


40 的二进制表示:
00101000

right_shift

Функция right_shift() сдвигает двоичную форму элементов массива вправо на указанное количество позиций, добавляя такое же количество нулей слева.

Пример

import numpy as np print ('Сдвиг числа 40 вправо на два бита:') print (np.right_shift(40,2)) print ('\n') print ('Двоичное представление числа 40:') print (np.binary_repr(40, width = 8)) print ('\n') print ('Двоичное представление числа 10:') print (np.binary_repr(10, width = 8)) # Два бита в '00001010' сдвинулись вправо, а два нуля добавились слева.

Результат вывода:

将 40 右移两位:
10


40 的二进制表示:
00101000


10 的二进制表示:
00001010
Другие расширения