عملگرهای بیتی
عملگرهای بیتی (Bitwise and Bitshift Operators) به شما اجازه میدهند که شکل باینری انواع دادهها را دستکاری کنید. برای درک بهتر این درس توصیه میشود که شما سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را از لینک زیر یاد بگیرید :
در سیستم باینری (دودویی) که کامپیوتر از آن استفاده میکند وضعیت هر چیز یا خاموش است یا روشن. برای نشان دادن حالت روشن از عدد 1 و برای نشان دادن حالت خاموش از عدد 0 استفاده میشود. بنابراین اعداد باینری فقط میتوانند صفر یا یک باشند. اعداد باینری را اعداد در مبنای 2 و اعداد اعشاری را اعداد در مبنای 10 می گویند. یک بیت نشان دهنده یک رقم باینری است و هر بایت نشان دهنده 8 بیت است. به عنوان مثال برای یک داده از نوع int به 32 بیت یا 4 بایت فضا برای ذخیره آن نیاز داریم، این بدین معناست که اعداد از 32 رقم 0 و 1 برای ذخیره استفاده میکنند. برای مثال عدد 100 وقتی به عنوان یک متغیر از نوع int ذخیره میشود در کامپیوتر به صورت زیر خوانده میشود :
000000000000000000000000000001100100
عدد 100 در مبنای ده معادل عدد 1100100 در مبنای 2 است. در اینجا 7 رقم سمت راست نشان دهنده عدد 100 در مبنای 2 است و مابقی صفرهای سمت راست برای پر کردن بیتهایی است که عدد از نوع int نیاز دارد. به این نکته توجه کنید که اعداد باینری از سمت راست به چپ خوانده میشوند. عملگرهای بیتی سی شارپ در جدول زیر نشان داده شدهاند :
عملگر | نام | دسته | مثال |
& | بیتی AND | Binary | x = y & z; |
| | بیتی OR | Binary | x = y | z; |
^ | بیتی XOR | Binary | x = y ^ z; |
~ | بیتی NOT | Unary | x = ~y; |
&= | بیتی AND Assignment | Binary | x &= y; |
|= | بیتی OR Assignment | Binary | x |= y; |
^= | بیتی XOR Assignment | Binary | x ^= y; |
عملگر بیتی AND(&)
عملگر بیتی AND کاری شبیه عملگر منطقی AND انجام میدهد با این تفاوت که این عملگر بر روی بیتها کار میکند. اگر مقادیر دو طرف آن 1 باشد مقدار 1 را بر میگرداند و اگر یکی یا هر دو طرف آن صفر باشد مقدار صفر را بر میگرداند. جدول درستی عمگر بیتی AND در زیر آمده است:
X | Y | X AND Y |
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
در زیر نحوه استفاده از عملگر بیتی AND آمده است :
int result = 5 & 3; Console.WriteLine(result);
1
همانطور که در مثال بالا مشاهده میکنید نتیجه عملکرد عملگر AND بر روی دو مقدار 5 و 3 عدد یک میشود. اجازه بدهید ببینیم که چطور این نتیجه را به دست میآید:
5: 00000000000000000000000000000101 3: 00000000000000000000000000000011 ------------------------------------ 1: 00000000000000000000000000000001
ابتدا دو عدد 5 و 3 به معادل باینریشان تبدیل میشوند. از آنجاییکه هر عدد صحیح(int) 32 بیت است از صفر برای پر کردن بیتهای خالی استفاده میکنیم. با استفاده از جدول درستی عملگر بیتی AND میتوان فهمید که چرا نتیجه عدد یک میشود.
عملگر بیتی OR(|)
اگر مقادیر دو طرف عملگر بیتی OR هر دو صفر باشند نتیجه صفر در غیر اینصورت 1 خواهد شد. جدول درستی این عملگر در زیر آمده است :
X | Y | X OR Y |
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
نتیجه عملگر بیتی OR در صورتی صفر است که عملوندهای دو طرف آن صفر باشند. اگر فقط یکی از دو عملوند یک باشد نتیجه یک خواهد شد. به مثال زیر توجه کنید :
int result = 7 | 9; Console.WriteLine(result);
15
وقتی که از عملگر بیتی OR برای دو مقدار در مثال بالا (7 و 9) استفاده میکنیم نتیجه 15 میشود. حال بررسی میکنیم که چرا این نتیجه به دست آمده است؟
7: 00000000000000000000000000000111 9: 00000000000000000000000000001001 ----------------------------------- 15: 00000000000000000000000000001111
با استفاده از جدول درستی عملگر بیتی OR میتوان نتیجه استفاده از این عملگر را تشخیص داد. عدد 1111 باینری معادل عدد 15 صحیح است.
عملگر بیتی XOR(^)
جدول درستی این عملگر در زیر آمده است :
X | Y | X XOR Y |
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
در صورتیکه عملوندهای دو طرف این عملگر هر دو صفر یا هر دو یک باشند نتیجه صفر در غیر اینصورت نتیجه یک میشود. در مثال زیر تأثیر عملگر بیتی XOR را بر روی دو مقدار مشاهده میکنید :
int result = 5 ^ 7; Console.WriteLine(result);
2
در زیر معادل باینری اعداد بالا (5 و 7) نشان داده شده است.
5: 00000000000000000000000000000101 7: 00000000000000000000000000000111 ----------------------------------- 2: 00000000000000000000000000000010
با نگاه کردن به جدول درستی عملگر بیتی XOR، میتوان فهمید که چرا نتیجه عدد 2 میشود.
عملگر بیتی NOT(~)
این عملگر یک عملگر یگانی است و فقط به یک عملوند نیاز دارد. در زیر جدول درستی این عملگر آمده است:
X | NOT X |
1 | 0 |
0 | 1 |
عملگر بیتی NOT مقادیر بیتها را معکوس میکند. در زیر چگونگی استفاده از این عملگر آمده است :
int result = ~7; Console.WriteLine(result);
به نمایش باینری مثال بالا که در زیر نشان داده شده است توجه نمایید.
7: 00000000000000000000000000000111 ------------------------------------ -8: 11111111111111111111111111111000
مثالهایی از عملگرهای بیتی
فرض کنید که از یک سبک خاص فونت در برنامهتان استفاده کنید. کدهای مربوط به هر سبک هم در جدول زیر آمده است :
سبک | کد |
Regular | 0 |
Bold | 1 |
Italic | 2 |
Underline | 4 |
Strikeout | 8 |
توجه کنید که مقدار اولیه صفر بدین معنی است که میخواهید از سبک regular (عادی) استفاده کنید.
int fontStyle = 0;
برای نشان دادن فونتها به صورت کلفت (Bold) از عملگر بیتی OR استفاده میشود. توجه کنید که برای فونت Bold باید کد 1 را به کار برید.
fontStyle = fontStyle | 1;
برای استفاده از سبک Italic باید از عملگر بیتی OR و کد 2 استفاده شود.
fontStyle |= 2;
برای استفاده از سایر سبکها میتوان به روشهای ذکر شده در بالا عمل کرد و فقط کدها را جایگزین کنید. اگر بخواهید یک سبک جدید ایجاد کنید که ترکیبی از چند سبک باشد میتوانید به سادگی عملگر بیتی OR را در بین هر سبک فونت قرار دهید مانند مثال زیر :
fontStyle = 1 | 2 | 4 | 8;
عملگر بیتی تغییر مکان (shift)
این نوع عملگرها به شما اجازه میدهند که بیتها را به سمت چپ یا راست جا به جا کنید. دو نوع عملگر بیتی تغییر مکان وجود دارد که هر کدام دو عملوند قبول میکنند. عملوند سمت چپ این عملگرها حالت باینری یک مقدار و عملوند سمت راست تعداد جابه جاییبیت ها را نشان میدهد.
عملگر | نام | دسته | مثال |
>> | تغییر مکان به سمت چپ | Binary | x = y << 2; |
<< | تغییر مکان به سمت راست | Binary | x = y >> 2; |
عملگر تغییر مکان به سمت چپ
این عملگر بیتهای عملوند سمت چپ را به تعداد n مکان مشخص شده توسط عملوند سمت راست، به سمت چپ منتقل میکند. به عنوان مثال :
int result = 10 << 2; Console.WriteLine(result);
40
در مثال بالا ما بیتهای مقدار 10 را دو مکان به سمت چپ منتقل کردهایم، حال بیایید تأثیر این انتقال را بررسی کنیم :
10: 00000000000000000000000000001010 ------------------------------------ 40: 00000000000000000000000000101000
مشاهده میکنید که همه بیتها به اندازه دو واحد به سمت چپ منتقل شدهاند. در این انتقال دو صفر از صفرهای سمت چپ کم میشود و در عوض دو صفر به سمت راست اضافه میشود.
عملگر تغییر مکان به سمت راست
این عملگر شبیه به عمگر تغییر مکان به سمت چپ است با این تفاوت که بیتها را به سمت راست جا به جا میکند. به عنوان مثال :
int result = 100 >> 4; Console.WriteLine(result);
6
با استفاده از عملگرتغییر مکان به سمت راست بیتهای مقدار 100 را به اندازه 4 واحد به سمت چپ جا به جا میکنیم. اجازه بدهید تأثیر این جا به جایی را مورد بررسی قرار دهیم :
100: 00000000000000000000000001100100 ------------------------------------ 6: 00000000000000000000000000000110
هر بیت به اندازه 4 واحد به سمت راست منتقل میشود، بنابراین 4 بیت اول سمت راست حذف شده و چهار صفر به سمت چپ اضافه میشود.
سلام. عملگرهای بیتی در چه نوع برنامه نویسی بیشتر کاربرد دارن؟ فرضا من میخوام ویندوز فرم کار کنم آیا نیاز هست که این مباحث عملگرهای بیتی رو یاد بگیرم؟
سایت و محصولاتتون خیلی عالی هستن.
سلام ببخشید میشه راجب عملگر های ترکیبی هم توضیح بدین
سلام چطوری در محیط کنسول فونت را وارد کنیم ؟ یعنی متغیر fontStyle را چه باید تعریف کنیم؟
اگه میشه یک نمونه کد بزارین
ممنون از آموزشای خوب و ساده تون
سلام.چرا در عملگر and وقتی 2&3 در برنامه قرار میدهم حاصل را 2نشان میدهد؟
سلام، اول از هر چیز ممنون میشم از این به بعد سوالتونو تو بخش پرسش و پاسخ مطرح بفرمایید. دوما، درسته به حال باینری دو عدد توجه کنید :
بعد لینک زیر رو ببینید
http://www.w3-farsi.com
سلامی دوباره.
در قسمت عملگر بیتی تغییر مکان (shift) در داخل جدول مکان عملگرهای شیفت چپ و راست را برعکس گذاشته اید. لطف فرمایید و آن را اصلاح کنید.
ممنون از توجهتون ، هر دو اصلاح شدن
سلام.
در قسمت عملگر بیتی NOT(~) به جای نمایش باینری ~7 دوباره کد نوشته شده را تکرار کرده اید. اگر امکان دارد آن را اصلاح بفرمایید.