NumPy ビット演算
ビット演算は、2進数のビットレベルで操作を行う演算の一種であり、数値の全体的な値を考慮せずに、2進数の各ビットを直接操作します。
NumPyは一連のビット演算関数を提供しており、配列の要素に対してビット単位の操作を行うことができます。これらの操作はPythonのビット演算子と似ていますが、NumPy配列に作用し、ベクトル化処理をサポートしているため、パフォーマンスがより高くなっています。
ビット演算はコンピュータサイエンスにおいて、最適化や低レベルデータの処理に広く応用されています。
NumPy bitwise_先頭の関数はビット演算関数です。
NumPyのビット演算には以下の関数が含まれます:
| 操作 | 関数/演算子 | 説明 |
|---|---|---|
| ビットごとのAND | numpy.bitwise_and(x1, x2) | 配列の各要素に対してビット単位のAND演算を実行します。 |
| ビットごとのOR | numpy.bitwise_or(x1, x2) | 配列の各要素に対してビット単位のOR演算を実行します。 |
| ビットごとのXOR | numpy.bitwise_xor(x1, x2) | 配列の各要素に対してビット単位のXOR演算を実行します。 |
| ビットごとのNOT | 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("NOT:", result_not) # [False, True, False]
# ビット反転
arr_invert = np.invert(np.array([1, 2], dtype=np.int8))
print("Invert:", arr_invert) # [-2, -3]
# 左シフト演算
arr_left_shift = np.left_shift(5, 2)
print("Left Shift:", arr_left_shift) # 20
# 右シフト演算
arr_right_shift = np.right_shift(10, 1)
print("Right Shift:", arr_right_shift) # 5
次の演算子も使用できます:"&"、"~"、"|"、"^"などの演算子を使用して計算できます:
AND演算(&):対応するビットの2つの数値が両方とも1の場合、結果は1になります。それ以外の場合、結果は0になります。
例:1010 & 1100 = 1000
OR演算(|):対応するビットの2つの数値のいずれかが1の場合、結果は1になります。それ以外の場合、結果は0になります。
例:1010 | 1100 = 1110
XOR演算(^):対応するビットの2つの数値が異なる場合、結果は1になります。同じ場合、結果は0になります。
例:1010 ^ 1100 = 0110
NOT演算(~):数値の各ビットを反転します。つまり、0は1に、1は0になります。
例:~1010 = 0101
左シフト演算(<<):数値のすべてのビットを指定したビット数だけ左に移動し、右側を0で埋めます。
例:1010 << 2 = 101000
右シフト演算(>>):数値のすべてのビットを指定したビット数だけ右に移動し、左側は符号ビットに応じて0または符号ビットで埋めます。
例:1010 >> 2 = 0010
bitwise_and
bitwise_and() 関数は、配列内の整数の2進数形式に対してビット単位のAND演算を実行します。
実例
出力結果は次のとおりです:
13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位与: 1
上記の実例は、次の表で説明できます:
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| AND | |||||
| 1 | 0 | 0 | 0 | 1 | |
| 演算結果 | 0 | 0 | 0 | 0 | 1 |
ビット単位のAND演算の規則は次のとおりです:
| A | B | AND |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 0 |
bitwise_or
bitwise_or() 関数は、配列内の整数の2進数形式に対してビット単位のOR演算を実行します。
実例
出力結果は次のとおりです:
13 和 17 的二进制形式: 0b1101 0b10001 13 和 17 的位或: 29
上記の実例は、次の表で説明できます:
| 1 | 1 | 0 | 1 | ||
|---|---|---|---|---|---|
| OR | |||||
| 1 | 0 | 0 | 0 | 1 | |
| 演算結果 | 1 | 1 | 1 | 0 | 1 |
ビット単位のOR演算の規則は次のとおりです:
| A | B | OR |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
invert
invert() 関数は、配列内の整数に対してビット反転演算を行います。つまり、0 は 1 に、1 は 0 になります。
符号付き整数の場合、その2進数の補数を取り、その後 +1 します。2進数では、最上位ビットが0の場合は正数を表し、最上位ビットが1の場合は負数を表します。
~1 の計算手順を見てみましょう:
- 将
1(ここでは「原码」と呼びます)2進数に変換 =00000001 - ビット反転 =
11111110 - 符号ビット(つまり最上位ビット)が
1(負数を表す)場合、符号ビット以外の他のビットを反転 =10000001 - 最下位ビットに1を加えて補数を取る =
10000010 - 10進数に戻す =
-2
| 式 | 2進数値(2の補数) | 10進数値 |
|---|---|---|
| 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() 関数は、配列要素の2進数形式を指定した位置だけ左に移動し、右側に同数の 0 を追加します。
実例
出力結果は次のとおりです:
将 10 左移两位: 40 10 的二进制表示: 00001010 40 的二进制表示: 00101000
right_shift
right_shift() 関数は、配列要素の2進数形式を指定した位置だけ右に移動し、左側に同数の 0 を追加します。
実例
出力結果は次のとおりです:
将 40 右移两位: 10 40 的二进制表示: 00101000 10 的二进制表示: 00001010その他の拡張