معاملات Python bitwise (منتج منطقي ، منطقي OR ، حصري OR ، انعكاس ، تحول)

اعمال

توفر Python عوامل تشغيل البت التالية ، والتي تقوم بتنفيذ الاقتران المنطقي ، والفصل المنطقي ، والفصل الحصري ، وانعكاس البتات ، وإزاحة البت الأيسر ، وإزاحة البت الأيمن على كل بت من نوع عدد صحيح ثنائي القيمة int ، على التوالي.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

في هذا القسم ، نشرح أولاً ما يلي.

  • تداخل(AND) :&
  • انفصال(OR) :|
  • عملية حصرية أو(XOR) :^

بعد ذلك ، سنناقش ما يلي.

  • عمليات البت على الأعداد الصحيحة السالبة
  • قليلا الوجه( NOT) :~
  • تحول قليلا:<<و>>

لمزيد من المعلومات حول كيفية كتابة الأعداد الصحيحة بالثنائي والثماني والست عشري ، وكيفية تحويل الأرقام والسلاسل الثنائية والثنائية والسداسية العشرية باستخدام الوظائف التالية ، راجع المقالة التالية.

  • bin()
  • oct()
  • hex()
  • format()

أيضًا ، بالنسبة للعمليات المنطقية (العمليات المنطقية) على القيم المنطقية (صواب ، خطأ) بدلاً من العمليات الأحادية ، يرجى الرجوع إلى المقالة التالية. استخدم و ، أو بدلاً من & amp؛ ، |.

تداخل(AND) :&المشغل أو العامل

هذا مثال على منطقي AND باستخدام & amp؛ عامل التشغيل ، مع تحويل النتيجة إلى سلسلة في تدوين ثنائي بواسطة bin ().

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

انفصال(OR) :|المشغل أو العامل

مثال على منتج منطقي (OR) يستخدم | عامل التشغيل ، مع تحويل النتيجة إلى سلسلة في تدوين ثنائي بواسطة bin () والإخراج معًا.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

عملية حصرية أو(XOR) :^المشغل أو العامل

مثال على منتج منطقي (XOR) يستخدم عامل التشغيل ^ ، مقترنًا بنتيجة التحويل إلى سلسلة في تدوين ثنائي باستخدام bin ().

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

العلاقة بين المدخلات والمخرجات لكل بت منطقي AND و OR و XOR موضحة في الجدول أدناه.

المدخلات 1المدخلات 2تداخل(AND)انفصال(OR)عملية حصرية أو(XOR)
11110
10011
01011
00000

عمليات البت على الأعداد الصحيحة السالبة

عندما يتم تنفيذ عملية بت على عدد صحيح سالب ، تتم معالجة القيمة كما لو تم التعبير عنها في شكل مكمل اثنين.

لاحظ ، مع ذلك ، أنه إذا قمت بتحويل عدد صحيح سالب إلى سلسلة ثنائية باستخدام bin () أو تنسيق () ، فإن القيمة المطلقة سيكون لها علامة ناقص بدلاً من تنسيق مكمل اثنين.

إذا كنت ترغب في الحصول على سلسلة بتمثيل مكمل لاثنين ، فاخذ AND مع الحد الأقصى لعدد أرقام البت المطلوبة ، كما هو موضح أدناه.

  • لـ 4 بت0b1111(=0xf)
  • لـ 8 بت0xff
  • لـ 16 بت0xffff

يمكنك الحصول على سلسلة من تمثيل مكملين اثنين (كل بت مقلوب ويضاف 1).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

قليلا الوجه:~المشغل أو العامل

~ مثال لقلب البت مع المشغلين.

انعكاس Bitwise ليس مجرد قيمة كل بت مقلوب. القيمة المعادة عند استخدام هذا العامل هي كما يلي.
~x#ERROR!-(x+1)

-(x+1)هذه القيمة تعادل اعتبار قيمة الإدخال x كشكل مكمل لاثنين وعكس كل البتات.

كما هو مذكور أعلاه ، في Python ، عندما يتم تحويل عدد صحيح سالب إلى سلسلة ثنائية باستخدام bin () ، التنسيق () ، وما إلى ذلك ، فإنه ليس في شكل مكمل اثنين ، ولكن في القيمة المطلقة مع علامة الطرح. لذلك ، فإن تحويل ~ x مباشرة إلى سلسلة لن ينتج عنه سلسلة مع بتات القيمة الأصلية المقلوبة.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

عندما نجري العملية AND ونحولها إلى سلسلة من تمثيل مكملين اثنين ، يمكننا أن نرى أن بتات القيمة الأصلية مقلوبة.

بالإضافة إلى ذلك ، على سبيل المثال ، للحصول على سلسلة بت عبارة عن سلسلة بت مكونة من 4 أرقام مقلوبة كما هي (تم حذف بت الإشارة) ، استخدم التنسيق () لملء الأصفار للقيمة ANDed على النحو التالي04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

تحول قليلا:<<و>>

أمثلة على إزاحة البت الأيسر وإزاحة البت الأيمن باستخدام عوامل إزاحة البت.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

للقيم السالبة ، يتم تمديد بت الإشارة وإزاحته ، وتظل الإشارة الموجبة / السالبة كما هي. القيمة السالبة هي صورة لخط من 1s على طول الطريق إلى اليسار.

x = -9
print(bin(x))
print(bin(x & 0xff))
# -0b1001
# 0b11110111

print(x << 1)
print(bin(x << 1))
print(bin((x << 1) & 0xff))
# -18
# -0b10010
# 0b11101110

print(x >> 1)
print(bin(x >> 1))
print(bin((x >> 1) & 0xff))
# -5
# -0b101
# 0b11111011

من الأفضل التفكير من منظور سلاسل من التعبيرات التكميلية لاثنين ، لأن التفكير من حيث الأرقام ليس واضحًا.