Pythonのビット演算子
Pythonのビット演算子は整数に対してビット演算を行うために使用されます。整数は2進数形式に変換され、それからビットごとに演算が行われます。だからこそ、ビット演算子という名前がついています。Pythonのビット演算子は整数に対してのみ機能し、最終的な出力は10進数形式で返されます。Pythonのビット演算子はまた、バイナリ演算子とも呼ばれています。
Pythonのビット演算子
Pythonには6つのビット演算子があります。以下の表はそれについての簡単な詳細を提供します。
Bitwise Operator | Description | Simple Example |
---|---|---|
& | Bitwise AND Operator | 10 & 7 = 2 |
Bitwise OR Operator | ||
^ | Bitwise XOR Operator | 10 ^ 7 = 13 |
~ | Bitwise Ones’ Compliment Operator | ~10 = -11 |
<< | Bitwise Left Shift operator | 10<<2 = 40 |
>> | Bitwise Right Shift Operator | 10>>1 = 5 |
1つずつこれらのオペレータを見て、それぞれがどのように機能するか理解しましょう。
1. ビットごとのAND演算子
PythonのビットごとのAND演算子は、両方のビットが1の場合に1を返し、それ以外の場合は0を返します。
>>> 10&7
2
>>>
2. ビットごとのOR演算子
Pythonのビット演算子「or」は、どれかのビットが1であれば1を返します。両方のビットが0の場合は0を返します。
>>> 10|7
15
>>>
3. ビットワイズXOR演算子
PythonのビットごとのXOR演算子は、1つのビットが0であり、もう一方のビットが1である場合に1を返します。両方のビットが0または1の場合は、0を返します。
>>> 10^7
13
>>>
4. ビットワイズ論理の補数演算子
Pythonにおける数値『A』の1の補数は、-(A+1)と等しい。
>>> ~10
-11
>>> ~-10
9
>>>
5. ビットシフト演算子
Pythonのビットワイズ左シフト演算子は、左オペランドのビットを右オペランドの回数だけ左側にシフトします。簡単に言えば、バイナリ数の末尾に0が追加されます。
>>> 10 << 2
40
>>>
6. ビット単位の右シフト演算子
Pythonの右シフト演算子は、左シフト演算子とまったく逆の働きをします。左側のオペランドのビットが指定された回数右側に移動されます。簡単に言えば、右側のビットが削除されます。
>>> 10 >> 2
2
>>>
Pythonのビット演算子のオーバーローディング
Pythonは演算子のオーバーロードをサポートしています。カスタムオブジェクトにビット演算子をサポートするために実装できるさまざまなメソッドがあります。
Bitwise Operator | Method to Implement |
---|---|
& | __and__(self, other) |
^ | __xor__(self, other) |
~ | __invert__(self) |
<< | __lshift__(self, other) |
>> | __rshift__(self, other) |
以下に、カスタムオブジェクトのビット演算子オーバーロードの例を示します。
class Data:
id = 0
def __init__(self, i):
self.id = i
def __and__(self, other):
print('Bitwise AND operator overloaded')
if isinstance(other, Data):
return Data(self.id & other.id)
else:
raise ValueError('Argument must be object of Data')
def __or__(self, other):
print('Bitwise OR operator overloaded')
if isinstance(other, Data):
return Data(self.id | other.id)
else:
raise ValueError('Argument must be object of Data')
def __xor__(self, other):
print('Bitwise XOR operator overloaded')
if isinstance(other, Data):
return Data(self.id ^ other.id)
else:
raise ValueError('Argument must be object of Data')
def __lshift__(self, other):
print('Bitwise Left Shift operator overloaded')
if isinstance(other, int):
return Data(self.id << other)
else:
raise ValueError('Argument must be integer')
def __rshift__(self, other):
print('Bitwise Right Shift operator overloaded')
if isinstance(other, int):
return Data(self.id >> other)
else:
raise ValueError('Argument must be integer')
def __invert__(self):
print('Bitwise Ones Complement operator overloaded')
return Data(~self.id)
def __str__(self):
return f'Data[{self.id}]'
d1 = Data(10)
d2 = Data(7)
print(f'd1&d2 = {d1&d2}')
print(f'd1|d2 = {d1|d2}')
print(f'd1^d2 = {d1^d2}')
print(f'd1<<2 = {d1<<2}')
print(f'd1>>2 = {d1>>2}')
print(f'~d1 = {~d1}')
出力:
Bitwise AND operator overloaded
d1&d2 = Data[2]
Bitwise OR operator overloaded
d1|d2 = Data[15]
Bitwise XOR operator overloaded
d1^d2 = Data[13]
Bitwise Left Shift operator overloaded
d1<<2 = Data[40]
Bitwise Right Shift operator overloaded
d1>>2 = Data[2]
Bitwise Ones Complement operator overloaded
~d1 = Data[-11]
もし新しい文字列のフォーマットに慣れていない場合は、Pythonのf-stringsについて読んでください。
要約すると、これは日本語での自然な表現が必要です。お願いします。
Pythonのビット演算子は主に数学的な計算に使用されます。また、カスタムクラスの実装でもビット演算子をサポートするための特定のメソッドを実装することができます。