tgoop.com/raspberry_python/6463
Create:
Last Update:
Last Update:
یکی از کاربرد های bitwise operator ها:
سلام. اگرچه توی زبان های سطح پایین تر استفاده از bitwise operator ها خیلی مرسومه، توی پایتون کمتر نیاز میشه تا برای حل مشکلمون بریم سراغشون و عموما از جایگزین های high-level تری استفاده میکنیم. ولی دونستن اینکه چیکار میکنن بعضی جاها میتونه مفید باشه.
فرض کنید میخوایم با یک regex ساده یه عبارتی رو match کنیم:
import reمچ نمیشن! حالا کافیه به عنوان flag بهش عدد ۱۸ رو بدیم:
print(re.search("ABC.", "abc\n"))
print(re.search("ABC.", "abc\n", flags=18))مچ شد! درواقع با دادن عدد ۱۸ بهش گفتیم که case-insensitive باش و new line character ها رو هم با نقطه بگیر. ولی چطور از عدد ۱۸ این رو فهمید؟
موضوع اینجاست که ما یک سری فلگ از پیش تعریف شده داریم که توان های عدد ۲ هستن. اگه یه نگاه بشون بندازیم:
TEMPLATE = 1 -> 00000001
IGNORECASE = 2 -> 00000010
LOCALE = 4 -> 00000100
MULTILINE = 8 -> 00001000
DOTALL = 16 -> 00010000
ما درواقع IGNORECASE رو OR کردیم با DOTALL که شد:00010010
یا همون ۱۸.حالا اگر کسی به ما عدد ۱۸ رو بده چطور میتونیم بفهمیم چه flag هایی ست شده؟ با AND:
TEMPLATE = 1
IGNORECASE = 2
LOCALE = 4
MULTILINE = 8
DOTALL = 16
flag = 18
if flag & TEMPLATE:
print("Has TEMPLATE flag")
if flag & IGNORECASE:
print("Has IGNORECASE flag")
if flag & DOTALL:
print("Has DOTALL flag")
به جای پاس دادن عدد ۱۸ میشه خیلی راحت از "|" استفاده کرد و چیزی رو حفظ نکرد:print(re.search("ABC.", "abc\n", flags=IGNORECASE | DOTALL))
این خودش ۱۸ رو میفرسته.نکته ی خوبش این بود که تنها با یک عدد این اطلاعات رو منتقل کردیم.
مثال دومی که از این استفاده کرده ماژول selectors هست که وقتی یه socket ای آماده میشه و میخواد بگه آماده ی read هست یا write ، بهمون یه mask میده که از روی این mask باید بفهمیم. یعنی یه همچین چیزی داریم:
EVENT_READ = (1 << 0)
EVENT_WRITE = (1 << 1)
اگه ۳ بود یعنی هم READ هم WRITE. اگه ۲ بود یعنی فقط WRITE، اگه 1 بود یعنی فقط READ.با همون if بالا متوجه میشیم و کاری که قرار هست انجام بدیم رو با توجه به این عدد انجام میدیم.
🖊 @AmirSoroushh
BY 🐍 Python & Raspberry 🐍
Share with your friend now:
tgoop.com/raspberry_python/6463