آموزش, رفرنس

عملگرهای بیتی در آردوینو

Bitwise operators in arduino

AND و بیتی (&)، OR یا بیتی (|) و XOR یای منحصر بیتی (^)

عملگرهای بیتی محاسبات خود را در سطح بیت متغیرها انجام می‌دهند. این نوع عملگرها به حل طیف گسترده‌ای از مشکلات متداول برنامه‌نویسی کمک می‌کنند.

بخش زیادی از مطالبی که در این پست راجع به محاسبات بیتی آمده، از آموزشی است که در اینجا قابل‌دسترس است.

عملگرهای بیتی در آردوینو:

“و” بیتی:

عملگر و بیتی در ++C تک امپرسند (&) است و بین دو عبارت از جنس integer قرار می‌گیرد. این عملگر مستقلاً روی تک‌تک بیت‌های عملوندهایش طبق این قانون عمل می‌کند: اگر هر دو بیت ورودی یک بودند، خروجی یک می‌شود؛ وگرنه خروجی صفر است. یک راه دیگر بیان کردن این موضوع، مثال زیر است:

در آردوینو نوع int، شانزده بیتی است؛ پس استفاده از عملگر & بین دو عبارت، باعث انجام 16 عمل AND همزمان خواهد شد. مثال در یک تکه کد:

هر 16 بیت a و b با استفاده از عملگر AND پردازش و همه‌ی 16 بیت حاصل در c ذخیره می‌شوند. حاصل، مقدار 01000100 باینری است که معادل عدد 68 دهدهی است.

یکی از معمول‌ترین استفاده‌های “و” بیتی، انتخاب بیت یا بیت‌هایی خاص از یک مقدار integer است که عمل ماسک کردن (masking) نامیده می‌شود. برای مثال:

 

“یا” بیتی:

عملگر یا بیتی در ++C، نماد لوله عمودی | (پایپ) است. همانند عملگر &، این عملگر نیز مستقلاً روی تک‌تک بیت‌های عملوندهایش عمل می‌کند؛ اما واضح است که کاری که انجام می‌دهد، از عمل & متفاوت است. حاصل عملگر OR دو بیت، در صورتی یک است که یکی یا هر دو بیت 1 باشند. وگرنه حاصل صفر می‌شود. به بیانی دیگر:

مثالی از یا بیتی در تکه کدی از ++C:

 برنامه‌ای مثالی برای آردوینو uno:

کاری معمول برای عملگرهای AND و OR کاری است که برنامه‌نویسان به آن خواندن- اصلاح- نوشتن (‌Read-Modify-Write) یک پورت می‌گویند. در میکروکنترلرها، پورت یک عدد 8 بیتی است که چیزی مربوط به شرایط پین‌ها را بیان می‌کند. نوشتن روی پورت، همه‌ی پین‌ها را به‌یک‌باره کنترل می‌کند.

PORTD یک ثابت توکار است که به وضعیت خروجی پین‌های دیجیتال 0,1,2,3,4,5,6,7 اشاره دارد. اگر در یک موقعیت بیت، 1 وجود داشته باشد، آن بیت HIGH است. (پین‌ها باید با دستور ()pinMode  به صورت خروجی تعریف شوند.) پس اگر بنویسیم ;PORTD = B00110001 پین‌های 0،4 و 5 را HIGH کرده‌ایم. در این عمل نکته‌ای وجود دارد: ممکن است که ما وضعیت پین‌های 0 و 1 را نیز تغییر داده‌ باشیم؛ این دو پین‌ برای ارتباطات سریال آردوینو استفاده می‌شوند؛ پس ما ممکن است که در ارتباط سریال مداخله کرده باشیم.

الگوریتم ما برای برنامه این است:

  • PORTD را بیاورید و تنها بیت‌هایی که متناظر با پین‌های دلخواهتان (پین‌هایی که می‌خواهید کنترل کنید.) هستند را پاک کنید. (با “و” بیتی)
  • برای پین‌های تحت کنترل، مقدار PORTD اصلاح‌شده را با مقدار جدید ترکیب کنید. (با “یا” بیتی)

 

“یای منحصر” بیتی (XOR):

یک عملگر کمی غیرمعمول در ++C است که به آن یای منحصر یا XOR (اکس اُر) بیتی گویند. عملگر یای منحصر بیتی با علامت ^ نوشته می‌شود. این عملگر بسیار شبیه به عملگر “یا” بیتی | است فقط هنگامی‌که هر دو عملوند یک باشند هم نتیجه‌ی 0 می‌دهد. در واقع نتیجه‌ی این عملگر هنگامی‌که دو عملوند مشابه داشته باشد، 0 و هنگامی‌که عملوندها متفاوت باشند 1 می‌شود.

یک مثال کد ساده:

 

‌معمولا از عملگر ^ برای تغییر وضعیت برخی از بیت‌های یک عبارت صحیح (مثلا تغییر از 0 به 1 یا 1 به 0) استفاده می‌شود. در یک عملیات XOR اگر در بیت ماسک عدد 1 باشد، آن بیت معکوس شده؛ اگر 0 باشد، بیت معکوس نشده و همان مقدار باقی می‌ماند. در زیر برنامه‌ای را برای چشمک زدن پین دیجیتال 5 می‌بینید:

 

 

عملگرهای بولی در آردوینو

منبع

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *