NumPy ビット演算

ビット演算は、2進数のビットレベルで操作を行う演算の一種であり、数値の全体的な値を考慮せずに、2進数の各ビットを直接操作します。

NumPyは一連のビット演算関数を提供しており、配列の要素に対してビット単位の操作を行うことができます。これらの操作はPythonのビット演算子と似ていますが、NumPy配列に作用し、ベクトル化処理をサポートしているため、パフォーマンスがより高くなっています。

ビット演算はコンピュータサイエンスにおいて、最適化や低レベルデータの処理に広く応用されています。

NumPy bitwise_先頭の関数はビット演算関数です。

NumPyのビット演算には以下の関数が含まれます:

操作関数/演算子説明
ビットごとのANDnumpy.bitwise_and(x1, x2)配列の各要素に対してビット単位のAND演算を実行します。
ビットごとのORnumpy.bitwise_or(x1, x2)配列の各要素に対してビット単位のOR演算を実行します。
ビットごとのXORnumpy.bitwise_xor(x1, x2)配列の各要素に対してビット単位のXOR演算を実行します。
ビットごとのNOTnumpy.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("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

次の演算子も使用できます:"&"、"~"、"|"、"^"などの演算子を使用して計算できます:

  1. AND演算(&):対応するビットの2つの数値が両方とも1の場合、結果は1になります。それ以外の場合、結果は0になります。

    例:1010 & 1100 = 1000

  2. OR演算(|):対応するビットの2つの数値のいずれかが1の場合、結果は1になります。それ以外の場合、結果は0になります。

    例:1010 | 1100 = 1110

  3. XOR演算(^):対応するビットの2つの数値が異なる場合、結果は1になります。同じ場合、結果は0になります。

    例:1010 ^ 1100 = 0110

  4. NOT演算(~):数値の各ビットを反転します。つまり、0は1に、1は0になります。

    例:~1010 = 0101

  5. 左シフト演算(<<):数値のすべてのビットを指定したビット数だけ左に移動し、右側を0で埋めます。

    例:1010 << 2 = 101000

  6. 右シフト演算(>>):数値のすべてのビットを指定したビット数だけ右に移動し、左側は符号ビットに応じて0または符号ビットで埋めます。

    例:1010 >> 2 = 0010

bitwise_and

bitwise_and() 関数は、配列内の整数の2進数形式に対してビット単位のAND演算を実行します。

実例

import numpy as np print ('13 と 17 の2進数形式:') a,b = 13,17 print (bin(a), bin(b)) print ('\n') print ('13 と 17 のビット単位のAND:') 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

ビット単位のAND演算の規則は次のとおりです:

A B AND
1 1 1
1 0 0
0 1 0
0 0 0

bitwise_or

bitwise_or() 関数は、配列内の整数の2進数形式に対してビット単位のOR演算を実行します。

実例

import numpy as np a,b = 13,17 print ('13 と 17 の2進数形式:') print (bin(a), bin(b)) print ('13 と 17 のビット単位のOR:') 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

ビット単位の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 000001015
    ~511111111 11111111 11111111 11111010 -6

実例

import numpy as np print ('13 のビット反転。ここで ndarray の dtype は uint8 です:') print (np.invert(np.array([13], dtype = np.uint8))) print ('\n') # 13 と 242 の2進数表現を比較すると、ビットが反転していることがわかります print ('13 の2進数表現:') print (np.binary_repr(13, width = 8)) print ('\n') print ('242 の2進数表現:') print (np.binary_repr(242, width = 8))

出力結果は次のとおりです:

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


13 的二进制表示:
00001101


242 的二进制表示:
11110010

left_shift

left_shift() 関数は、配列要素の2進数形式を指定した位置だけ左に移動し、右側に同数の 0 を追加します。

実例

import numpy as np print ('10 を2ビット左にシフト:') print (np.left_shift(10,2)) print ('\n') print ('10 の2進数表現:') print (np.binary_repr(10, width = 8)) print ('\n') print ('40 の2進数表現:') print (np.binary_repr(40, width = 8)) # '00001010' の2ビットが左に移動し、右側に2つの 0 が追加されました。

出力結果は次のとおりです:

将 10 左移两位:
40


10 的二进制表示:
00001010


40 的二进制表示:
00101000

right_shift

right_shift() 関数は、配列要素の2進数形式を指定した位置だけ右に移動し、左側に同数の 0 を追加します。

実例

import numpy as np print ('40 を2ビット右にシフト:') print (np.right_shift(40,2)) print ('\n') print ('40 の2進数表現:') print (np.binary_repr(40, width = 8)) print ('\n') print ('10 の2進数表現:') print (np.binary_repr(10, width = 8)) # '00001010' の2ビットが右に移動し、左側に2つの 0 が追加されました。

出力結果は次のとおりです:

将 40 右移两位:
10


40 的二进制表示:
00101000


10 的二进制表示:
00001010
その他の拡張