پایتون عملگرهای بیتی زیر را ارائه می دهد که به ترتیب بر روی هر بیت از یک مقدار int نوع عدد صحیح باینری، پیوند منطقی، تفکیک منطقی، تفکیک انحصاری، وارونگی بیتی، تغییر بیت چپ و شیفت بیت راست را انجام می دهند.
&
|
^
~
<<
>>
در این قسمت ابتدا موارد زیر را توضیح می دهیم.
- تقاطع(AND) :
&
- تفکیک(OR) :
|
- عملیات انحصاری-OR(XOR) :
^
در ادامه به موارد زیر می پردازیم.
- عملیات بیتی روی اعداد صحیح منفی
- کمی تلنگر( NOT) :
~
- تغییر بیت:
<<
،>>
برای اطلاعات بیشتر در مورد نحوه نوشتن اعداد صحیح به صورت باینری، اکتال و هگزا دسیمال و نحوه تبدیل اعداد و رشته های باینری، اکتال و هگزادسیمال با استفاده از توابع زیر به مقاله زیر مراجعه کنید.
bin()
oct()
hex()
format()
همچنین برای عملیات منطقی (عملیات بولی) روی مقادیر بولی (true, false) به جای عملیات بیتی به مقاله زیر مراجعه کنید. از و، یا به جای &،| استفاده کنید.
تقاطع(AND) :&اپراتور
این نمونه ای از یک AND منطقی با استفاده از & عملگر، که در نتیجه توسط 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
عملیات انحصاری-OR(XOR) :^اپراتور
مثالی از یک محصول منطقی (XOR) با استفاده از عملگر ^، ترکیب شده با نتیجه تبدیل به یک رشته در نماد دودویی با استفاده از bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
رابطه بین ورودی و خروجی برای هر بیت منطقی AND، OR، و XOR در جدول زیر نشان داده شده است.
ورودی 1 | ورودی 2 | تقاطع(AND) | تفکیک(OR) | عملیات انحصاری-OR(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
عملیات بیتی روی اعداد صحیح منفی
هنگامی که یک عملیات بیتی بر روی یک عدد صحیح منفی انجام می شود، مقدار به گونه ای پردازش می شود که گویی در فرم مکمل دو بیان شده است.
البته توجه داشته باشید که اگر یک عدد صحیح منفی را با استفاده از bin() یا format( به یک رشته باینری تبدیل کنید، قدر مطلق به جای فرمت مکمل دو، علامت منفی خواهد داشت.
اگر می خواهید رشته ای با نمایش مکمل دو دریافت کنید، مانند شکل زیر، 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
کمی تلنگر:~اپراتور
~ مثالی از ورق زدن بیت با عملگرها.
وارونگی بیتی صرفاً ارزش هر بیت معکوس نیست. مقدار بازگشتی هنگام استفاده از این عملگر به صورت زیر است.~x
#ERROR!-(x+1)
-(x+1)
این مقدار معادل در نظر گرفتن مقدار ورودی x به عنوان یک فرم مکمل دو و معکوس کردن همه بیت ها است.
همانطور که در بالا ذکر شد، در پایتون، وقتی یک عدد صحیح منفی با استفاده از bin()، format() و غیره به یک رشته باینری تبدیل میشود، به صورت مکمل دو نیست، بلکه به صورت قدر مطلق با علامت منفی است. بنابراین، تبدیل ~x به طور مستقیم به یک رشته منجر به رشته ای با بیت های مقدار اصلی معکوس نمی شود.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
وقتی عملیات AND را انجام می دهیم و آن را به رشته ای از نمایش مکمل دو تبدیل می کنیم، می بینیم که بیت های مقدار اصلی معکوس شده اند.
علاوه بر این، به عنوان مثال، برای به دست آوردن یک رشته بیت که یک رشته بیت 4 رقمی معکوس شده است (بیت علامت حذف شده)، از format() برای پر کردن صفرهای مقدار 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
برای مقادیر منفی، بیت علامت گسترش یافته و جابجا می شود و علامت مثبت/منفی ثابت می ماند. مقدار منفی تصویری از یک خط 1 است که تماماً به سمت چپ است.
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
بهتر است بر حسب رشتههای عبارتهای متمم دو فکر کنیم، زیرا فکر کردن بر اساس اعداد واضح نیست.