عملگرهای بیتی پایتون (محصول منطقی، OR منطقی، OR انحصاری، وارونگی، شیفت)

کسب و کار

پایتون عملگرهای بیتی زیر را ارائه می دهد که به ترتیب بر روی هر بیت از یک مقدار 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)
11110
10011
01011
00000

عملیات بیتی روی اعداد صحیح منفی

هنگامی که یک عملیات بیتی بر روی یک عدد صحیح منفی انجام می شود، مقدار به گونه ای پردازش می شود که گویی در فرم مکمل دو بیان شده است.

البته توجه داشته باشید که اگر یک عدد صحیح منفی را با استفاده از 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

بهتر است بر حسب رشته‌های عبارت‌های متمم دو فکر کنیم، زیرا فکر کردن بر اساس اعداد واضح نیست.

Copied title and URL