مفهوم علامت ؟ در کد آردینو

بسمه تعالی
با سلام و احترام
اگر ممکن است مفهوم علامت ؟ در برنامه پیوست و همچنین تحلیل 8 خط کد برنامه پیوست را بفرمایید
با تشکر
SIGN.rar (483 بایت)

این خط رو هم تحلیل کنیم با هم:

digitalWrite(onesBit, (i & 1));

اون قسمت i&1 رو فقط تحلیل میکنیم. هر عددی که با عدد 1 and بشه، فقط بیت اولش باقی میمونه و همه بیت هاش برابر 0 میشه. این رو روی کاغذ بنویسید و مثال بزنید تا براتون جا بیفته. در واقع این خط کد داره به جای HIGH و یا LOW، بیت اول متغیر i رو میذاره اونجا. میدونیم که 0 برابر false هست در شرط ها و 1 برابر true. از طرفی HIGH و LOW هم همون true و false هستن درواقع که اسمشون رو عوض کردن. پس شما میتونید به جای LOW بدید 0 و به جای HIGH بدید 1 و نتیجه فرقی نمیکنه. پس این کد میگه اگه بیت اول i برابر 1 بود، خروجی رو روشن کن و اگر نبود خاموش کن.

در خطوط پایین تر این عبارت رو داریم:

(i & 2) >> 1

این میگه که i رو با عدد 2 and کن و یکی شیفت بده به راست. این داره بیت دوم i رو استخراج میکنه. روی کاغذ عدد 2 رو به صورت باینری بنویسید و با عدد های باینری دیگه and کنید تا براتون جا بیفته. اون شیفت راست رو هم وقتی برای خودتون مثال بزنید مشخص میشه. (در بسته الکترونیک زیاد این کار رو میکنیم و مثال های زیادی هست)

(i & 4) >> 2

این کد داره بیت سوم رو استخراج میکنه.

(i & 8) >> 3

و این کد داره بیت چهارم رو استخراج میکنه.

1 پسندیده

سلام دوست عزیز، به این عملگر که شبیه به if عمل میکنه، ternary operator میگن.
Ternary Operator in C - SyntaxDB - C Syntax Reference.

condition ? resultForTrue : resultForFalse
اینطوری کار میکنه که شما یک شرط رو مینویسید (در مثالی که نوشتم میشه condition ) بعد از اون علامت سوال ؟ میذارید. اگر اون شرط برقرار بود (یعنی مقدارش true بود)، خروجی این بلوک میشه چیزی که جلوی علامت سوال نوشتید (در مثالی که نوشتم میشه resultForTrue) و اگر شرط برقرار نبود، خروجی میشه اون چیزی که بعد از : نوشتید. (در مثالی که نوشتم میشه resultForFalseّ)

این کد با کد زیر برابر هست:

if(conditions){
return resultForTrue;
}else{
return resultForFalse;
}

مثال کاربردی:
فرض کنید که یک متغیر a دارید از نوع عددی و یک متغیر b دارید از نوع عددی. می خواهیم متغیر سومی تعریف کنیم به اسم c که اگر مقدار a بزرگتر از b بود، برابر a باشه و اگر مقدار b بزرگتر مساوری a بود برابر b بشه. این کد با if اینطوری میشه:

if(a > b){
c = a;
}else{
c = b;
}

حالا این کد رو میشه خیلی خلاصه تر با استفاده از ? اینطوری نوشت:

c = a > b ? a : b;

یعنی اگر a از b بزرگتر بود، میشه a و اگر نبود میشه b

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

digitalWrite(chipInh0, (i < 16)? LOW:HIGH);

دستور digitalWrite رو که باید بلد باشید. یک پین رو میگیره و روشن یا خاموش میکنه. پین chipInh0 که قطعا بالاتر تعریف شده که چی هست (معمولا در قسمت define تعریف میشن این متغیر ها) رو قرار هست خاموش یا روشن کنیم. این کد میگه اگر متغیر i از ۱۶ کوچکتر بود، پین رو LOW کن و اگر نبود HIGH کن. اگر میخواستیم این کد رو با if بنویسیم، دو راه داشتیم:
یا باید یک متغیر جدید میساختیم (مثلا به اسم output) و میگفتیم اگر i از ۱۶ کوچکتر بود برابر LOW هست و اگر نه برابر HIGH و اون رو به digitalWrite میدادیم:

if(i < 16){
output = LOW;
}else{
output = HIGH;
}
digitalWrite(chipInh0, output)

یا باید کلش رو داخل if قرار میدادیم. اینطوری:

if(i < 16){
digitalWrite(chipInh0, LOW);
}else{
digitalWrite(chipInh0, HIGH);
}

ولی به جای دو روش بالا، میتونیم خیلی خلاصه اینطوری بنویسیم:

digitalWrite(chipInh0, (i < 16)? LOW:HIGH);

یعنی اگر i < 16 بود اونجا LOW بذار و اگر نبود HIGH بذار.

خط دوم برنامه یک شرط دوتایی رو داخل پرانتز گذاشته که اگر داخل پرانتز برقرار بشه یا نشه خروجی رو تغییر میده.

digitalWrite(chipInh1, (i > 15 && i < 32)? LOW:HIGH);

این میگه که اگر i از ۱۵ بزرگتر بود ولی از ۳۲ کوچکتر بود، خروجی رو LOW بذار و اگر نبود HIGH بذار.