برای ارتباط با مدیر سایت از ID تلگرام ebrahimi_younes@ استفاده نمایید. به سوالات و مشکلات برنامه نویسی پاسخ داده نمی شود.

عملگرهای بیتی

عملگرهای بیتی به شما اجازه می دهند که شکل باینری انواع داده ها را دستکاری کنید. برای درک بهتر این درس توصیه می شود که شما سیستم باینری و نحوه تبدیل اعداد دهدهی به باینری را یاد بگیرید. در سیستم باینری (دودویی) که کامپیوتر از آن استفاده می کند وضعیت هر چیز یا خاموش است یا روشن. برای نشان دادن حالت روشن از عدد 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 بیت اول سمت راست حذف شده و چهار صفر به سمت چپ اضافه می شود.

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. مسعود ملکی پاسخ دادن

    سلام.
    در قسمت عملگر بیتی NOT(~) به جای نمایش باینری ~۷ دوباره کد نوشته شده را تکرار کرده اید. اگر امکان دارد آن را اصلاح بفرمایید.

  2. مسعود ملکی پاسخ دادن

    سلامی دوباره.
    در قسمت عملگر بیتی تغییر مکان (shift) در داخل جدول مکان عملگرهای شیفت چپ و راست را برعکس گذاشته اید. لطف فرمایید و آن را اصلاح کنید.

    • یونس ابراهیمی پاسخ دادن

      ممنون از توجهتون ، هر دو اصلاح شدن