אופרטורים ביטיים בפייתון

אופרטורי Bitwise ב-Python

אופרטורי Bitwise ב-Python משמשים לביצוע חישובים Bitwise על מספרים שלמים. המספרים מומרים לתבנית בינארית ואז מתבצעות הפעולות פיתרון לפיתרון. לכן נקראים לאופרטורים אלו אופרטורים Bitwise. אופרטורי Bitwise ב-Python עובדים על מספרים שלמים בלבד והפלט הסופי מוחזר בתבנית עשרונית. אופרטורי Bitwise ב-Python נקראים גם אופרטורים בינאריים.

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

ב-Python ישנם 6 אופרטורי Bitwise. הטבלה למטה מספקת פרטים קצרים עליהם.

1. אופרטור Bitwise AND

אופרטור Bitwise and ב-Python מחזיר 1 אם שני הביטים הם 1, אחרת 0.

>>> 10&7
2
>>> 
Python Bitwise And Operator

2. אופרטור Bitwise OR

אופרטור Bitwise or ב-Python מחזיר 1 אם אחד מהביטים הוא 1. אם שני הביטים הם 0, אז הוא מחזיר 0.

>>> 10|7
15
>>> 
Python Bitwise Or Operator

3. אופרטור XOR בינארי

אופרטור XOR בפייתון מחזיר 1 אם אחד מהביטים הוא 0 והביט השני הוא 1. אם שני הביטים הם 0 או 1, התוצאה היא 0.

>>> 10^7
13
>>> 
Python Bitwise XOR Operator

4. אופרטור תיקוני התמלאות לבינארי אחד

ההשלמה הבינארית (Ones’ complement) של מספר 'A' בפייתון היא שווה ל-(A+1).

>>> ~10
-11
>>> ~-10
9
>>> 
Python Bitwise Ones Complement Operator

5. אופרטור הזזת בינארי לשמאל

אופרטור הזזת בינארי לשמאל בפייתון מזיז את ביטי המקור לכיוון השמאלי למספר הנתון שבאמצעות הפעולה בין האופרנדים. במילים פשוטות, המספר הבינארי מתווסף ב-0 בסופו.

>>> 10 << 2
40
>>> 
Python Bitwise Left Shift Operator

6. אופרטור הזזת בינארי לימין

האופרטור לשמאל בפייתון הוא בדיוק ההיפך של האופרטור לימין. כאשר ביטים מהצד השמאלי נעים לעבר הצד הימני עבור מספר הנתון של פעמים. במונחים פשוטים, הביטים מהצד הימני מוסרים.

>>> 10 >> 2
2
>>>  
Python Bitwise Right Shift Operator

העמסת אופרטורים לביטיות בפייתון

פייתון תומך בעמסת אופרטורים. ישנם שיטות שונות שאנו יכולים ליישם כדי לתמוך באופרטורים לביטיים עבור אובייקטים מותאמים אישית שלנו.

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]

אם אינך מוכר עם פורמט המחרוזת החדש, יש לקרוא על f-strings בפייתון.

סיכום

אופרטורי הביט הביטאיים בפייתון נעשה שימוש בעיקר בחישובים מתמטיים. אנו יכולים ליישם שיטות ספציפיות כדי לתמוך באופרטורים לביטיים עבור המימושים של מחלקות מותאמות אישית שלנו גם.

Source:
https://www.digitalocean.com/community/tutorials/python-bitwise-operators