سلام ...
در برنامه نویسی و الکترونیک ( مخصوصا در هنگام کار با میکرو کنترلر ها ) همواره با اعداد مبنای 2 ( Binary ) و مبنای 16 ( Hexadecimal ) سر و کار داریم ، تسلط روی این اعداد و شناخت عملگرهایی که روی این اعداد تاثیرگذار هستن یکی از ملزمات محسوب میشه !
توی این پست در مورد عملگرهای بیتی ( Bitwise Operators ) بحث می کنیم و چند مثال در زبانهای C و Delphi رو با هم مرور خواهیم کرد ...
عملگرهای بیتی پر کاربرد 6 تا هستن :
قبل از ادامه ی کار این نکته رو بگم که هر عدد مبنای دو رو معمولا با 8 رقم به عنوان یک بایت نشون می دیم و هر رقم اون رو یک بیت در نظر می گیریم .
عملگر AND :
عملگر AND به این صورت عمل میکنه که اگر بیتهای متناظر در دو عدد باینری هر دو مقدار 1 داشتند ، بیت متناظر در عدد باینری حاصل هم مقدار 1 می گیره ، به عنوان مثال ، فرض کنیم ، قصد داریم دو عدد باینری " 10011010 " و " 00110110 " رو با هم AND کنیم ! ، حاصل به صورت زیر خواهد بود :
10011010 00110110 =
00010010
|
به نحوه ی محاسبه دقت کنید ، بیتهای شماره ی 2 و 5 عدد نهایی مقدار 1 گرفتن ، چون بیتهای متناظر اونها در اعدادی که با هم AND شدن ، هر دو مقدار 1 داشتن ولی سایر بیتها این ویژگی رو نداشتن و بیت نظیرشون در عدد نهایی مقدار صفر گرفت .
عملگر OR :
عملگر OR به این صورت عمل میکنه که اگر یکی از بیتهای متناظر در دو عددی که با هم OR می شن ، مقدار 1 بگیره ، بیت نظیر اونها توی عدد حاصل هم مقدار یک می گیره ، مثال :
10011010
00110110
=
10111110
|
توجه کنید که اگر 2 بیت نظیر ، هر دو مقدار یک داشتن باز هم شرط برقراره ...
عملگر XOR :
این عملگر درواقع X + OR هست و X به جای عبارت Exclusive به معنای " یکتا " یا " انفرادی " قرار گرفته ، نحوه ی عملش هم دقیقا مثل OR هست با این تفاوت که اگر هر دو بیت متناظر مقدارشون 1 بود در شرط صدق نمی کنه و عدد نهایی در بیت نظیر اونها مقدار صفر می گیره ، مثال :
10011010
00110110
=
10101100
|
پس : " یا فقط بیت عدد اول یک باشد یا فقط بیت نظیر در عدد دوم یک باشد "
عملگر NOT :
این عملگر صفرهای یک عدد رو به یک و یک های اون رو به صفر تبدیل میکنه ، به عنوان مثال :
عملگر SHL :
حروف SHL مخفف عبارت Shift Left هستن ، به معنی انتقال به چپ ، این عملگر ، بیتهای با مقدار یک رو یک رقم به سمت چپ شیفت میده ، به عنوان مثال :
توجه کنید که عدد یک آخری حذف و یک صفر از ابتدا به رقمها اضافه شد ، برای درک بهتر تصویر زیر کمکتون می کنه :
-------------------------------------------------

-------------------------------------------------
عملگر SHR :
حروف SHR مخفف عبارت Shift Right هستن و به معنی انتقال به راست ، این عملگر هم مثل SHL عمل میکنه ، با این تفاوت که بیتهای یک رو به سمت راست شبفت میده ، مثال :
مانند SHL اگر در سمت راست رقمها عدد یک وجود داشته باشه حذف میشه و از سمت چپ یک صفر اضافه میشه ، برای درک بهتر تصویر زیر کمکتون می کنه ! :
-------------------------------------------------

-------------------------------------------------
خوب ، تا اینجا با عملگرها آشنا شدیم ، به چند نکته دقت کنید :
در زبان C ، که اغلب در الکترونیک و کار با میکروکنترلرها استفاده میشه ، این عملگرها هر کدوم نماد مشخصی دارن که در جدول زیر مشاهده میکنید ، :
عملگر
| نماد
|
| AND | &
|
OR
| |
|
| XOR | ^
|
| NOT | ~
|
| SHL | <<
|
| SHR | >>
|
پس ، برای استفاده از این عملگرها در زبان C ، باید از نماد معادل اونها استفاده کنید ، این نکته رو هم در نظر بگیرید که اعداد مبنای دو در زبان C با عبارت " 0b " در ابتداشون مشخص می شن ، اعداد مبنای 16 هم با عبارت " 0x " ، عملگرهایی که معرفی شدن ، هم برای مبنای 2 و هم برای مبنای 16 کاربرد دارن ، اگر از این عملگرها برای اعداد مبنای 16 استفاده کنید ، برنامه ابتدا اونها رو به مبنای دو تغییر میده و بعد از تاثیر دادن عملگر بر روی بیتهای عدد مبنای دو اون رو به صورت یک عدد مبنای 16 در میاره .
چند مثال :
A = 0b10011010; B = 0b00110110;
A & B = 0b00010010
A = ~ B ; A = 0b11001001;
A = B >> 2; : یعنی 2 بیت به سمت راست شیفت شود A = 0b00001101; ...
|
در زبان دلفی ( یا پاسکال ) از خود عبارت ها به جای نماد اونها استفاده کنید ، نحوه ی استفاده تفاوتی نداره ، توجه کنید که در زبان دلفی نمی تونید مستقیما عدد باینری بنویسید ! ، بلکه باید اعداد رو به صورت مبنای 16 ( Hexadecimal ) بنویسید ، اعداد هگزادسیمال در دلفی با کارکتر " $ " در ابتداشون مشخص می شن.
انشاالله در یک پست جدا در مورد مبناهای عددی و نحوه ی محاسبه ی اونها بحث خواهیم کرد ...
امیدوارم مفید بوده باشه ، موفق باشید ...