در این جلسه عملگرهای بیتی در C – شیفت، AND، OR، XOR و مکمل ها را باهم یاد میگیریم تا برنامههای حرفهای تری را بنویسیم.عملگر بیتی چیست؟ عملگرهای بیتی برای دستکاری داده درسطح بیت مورد استفاده قرار می گیرند. این عمل به عنوان برنامه نویسی در سطح بیت نیر شناخته شده است. برنامه نویسی در سطح بیت بر اساس 0 و 1 انجام می گیرد. این نوع برنامه نویسی برای محاسبات عددی و افزایش سرعت فرآیند محاسبات بکار می رود.
جدول زیر لیست عملگرهای بیتی در زبان برنامه نویسی C را آورده است:
عملگرهای بیتی را نمی توان مستقیماً روی داده های اصلی مانند float ، double و… اعمال کرد. همیشه به خاطر داشته باشید که عملگرهای بیتی بخاطر سازگاری با نوع داده Integer ، در بیشتر اوقات تنها برای این نوع داده بکار می روند.
عملگرهای منطقی بیتی روی داده ها به صورت بیت به بیت عمل می کنند، به این ترتیب که از کم اهمیت ترین بیت، یعنی LSB که سمت راست ترین بیت است شروع کرده و به سمت MSB(مهم ترین بیت) که سمت چپ ترین بیت است حرکت می کنند.
خروجی حاصله از عملگرهای منطقی بیتی در جدول زیر آورده شده است:
اگر با مدار منطقی آشنا نیستین توصیه میکنم مقاله جامع و ساده مدار منطقی را مطالعه کنید.
در این آموزش خواهیم آموخت:
- عملگر بیتی چیست؟
- عملگر AND بیتی
- عملگر OR بیتی
- عملگر OR انحصاری بیتی
- عملگرهای شیفت بیتی
- عملگر مکمل بیتی
عملگر AND بیتی در C
این عملگر یکی از پرکاربردترین عملگرهای بیتی است. این عملگر با یک علامت امپرسند(&) نمایش داده می شود. دو عبارت صحیح در دوطرف این عملگر(&) نوشته می شوند.
اگر دو بیت 1 باشند، نتیجه عملگر AND برابر 1 است؛ در غیر این صورت نتیجه همواره 0 است.
فرض کنیم که دو متغیر op1 و op2 با مقادیر زیر را داریم:
Op1 = 0000 1101 Op2 = 0001 1001
نتیجه عمل AND روی دو متغیر op1 و op2 برابر خواهد بود با:
Result = 0000 1001
همانطور که می بینیم، دو متغیر به صورت بیت به بیت باهم مقایسه شده اند. هرزمان که مقدار بیت در هردو متغیر 1 باشد، خروجی 1 و در غیراینصورت 0 است.
عملگر OR بیتی
این عملگر با علامت خط عمودی(|) مشخص می شود. دو عبارت صحیح در دو طرف عملگر(|) نوشته می شوند.
اگر حداقل یکی از عبارات 1 باشد، خروجی برابر 1 است؛ در غیر این صورت خروجی صفر خواهد شد.
فرض کنیم که دو متغیر op1 و op2 با مقادیر زیر را داریم:
Op1 = 0000 1101 Op2 = 0001 1001
نتیجه عمل OR روی دو متغیر op1 و op2 برابر می شود با:
Result = 0001 1101
همانطور که ملاحظه می کنیم، دو متغیر به صورت بیت به بیت مقایسه می شوند. هرگاه مقدار بیت در یکی از متغیرها 1 باشد، نتیجه برابر 1 شده و در غیر این صورت 0 می شود.
عملگر OR انحصاری
این عملگر با علامت (^) بیان می شود. عبارت صحیح در دو طرف عملگر(^) نوشته می شوند.
اگر فقط یکی از عبارات مقدار 1 داشته باشد، نتیجه عمل OR انحصاری یک خواهد شد؛ در غیر این صورت نتیجه همیشه 0 است
فرض کنیم که دو متغیر op1 و op2 با مقادیر زیر را داریم:
Op1 = 0000 1101 Op2 = 0001 1001
نتیجه عمل OR انحصاری روی دو متغیر op1 و op2 برابر است با:
Result = 0001 0100
همچنان که مشاهده می کنیم، دو متیغر به صورت بیت به بیت مقایسه می شوند. هرگاه فقط یکی از دو متغیر مقدار 1 داشته باشد، نتیجه برابر 1 شده و در غیر این صورت نتیجه صفر خواهد بود.
مثال ساده زیر عملگرهای منطقی بیتی را نشان می دهد.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int b = 21; /* 21 = 010101 */ int c = 0; c = a & b; /* 20 = 010100 */ printf("AND - Value of c is %d\n", c ); c = a | b; /* 21 = 010101 */ printf("OR - Value of c is %d\n", c ); c = a ^ b; /* 1 = 0001 */ printf("Exclusive-OR - Value of c is %d\n", c ); getch(); }
خروجی:
AND - Value of c is 20 OR - Value of c is 21 Exclusive-OR - Value of c is 1
عملگرهای جابجایی(شیفت) بیتی
عملگرهای شیفت بیتی برای جابجا کردن یک الگوی بیتی به سمت راست یا چپ بکار می روند. شیفت چپ و راست، دو عملگر شیفت در زبان C بوده که به صورت زیر نمایش داده می شوند:
Operand << n (Left Shift) Operand >> n (Right Shift)
- عملوند یک عبارت صحیح بوده که روی آن عمل شیفت انجام می شود.
- ‘n’ تعداد کل بیتهایی بوده که می خواهیم در متغیر صحیح جابجا شوند.
عمل شیفت چپ، تعداد ‘n’ بیت را به سمت چپ جابجا می کند. سمت چپ ترین بیت ها در عبارت جابجا شده، و n بیت در سمت راست با مقدار 0 پر می شوند.
عمل شیفت راست، تعداد ‘n’ بیت را به سمت راست جابجا می کند. سمت راست ترین بیت ها در عبارت جابجا شده، و n بیت در سمت چپ با مقدار 0 پر می شوند.
مثال: x یک متغیر صحیح با مقدار 1111 است. بعد از انجام عمل شیفت برابر می شود با:
x << 2 (left shift) = 1111<<2 = 0011 x>>2 (right shift) = 1111>>2 = 1100
عملگرهای شیفت را می توان با هم ترکیب کرده و برای استخراج داده از عبارت صحیح بکار بست. اجازه دهید برنامه ای بنویسیم که استفاده از عملگرهای شیفت را نشان می دهد.
#include <stdio.h> int main() { int a = 20; /* 20 = 010100 */ int c = 0; c = a << 2; /* 80 = 101000 */ printf("Left shift - Value of c is %d\n", c ); c = a >> 2; /*05 = 000101 */ printf("Right shift - Value of c is %d\n", c ); return 0; }
خروجی:
Left shift - Value of c is 80 Right shift - Value of c is 5
پس از انجام عمل شیفت چپ ، مقدار برابر 80 شده که معادل باینری آن 101000 می باشد.
پس از انجام عمل شیفت راست، مقدار برابر 5 شده که معادل باینری آن 000101 است.
عملگر مکمل 1 بیتی
مکمل بیتی ، مکمل یک نیز نامیده می شود زیرا همواره تنها یک مقدار یا عملوند دریافت می کند. این عملگر یک عملگر یگانی است.
وقتی مکمل روی هر بیتی انجام شود، همه 1ها به 0 تبدیل شده و 0ها به 1 تبدیل می شوند.
اگر یک عبارت صحیح حاوی مقدار 0000 1111 داشته باشیم، آنگاه انجام عمل مکمل مقدار آن را به 1111 0000 تبدیل می کند.
عملگر مکمل با علامت (~) مشخص می شود.
برنامه ای می نویسیم که پیاده سازی عملگر مکمل را به نمایش بگذارد.
#include <stdio.h> int main() { int a = 10; /* 10 = 1010 */ int c = 0; c = ~(a); printf("Complement - Value of c is %d\n", c ); return 0; }
خروجی:
Complement - Value of c is -11
در اینجا برنامه دیگری آورده ایم که مثالی ازهمه عملگرهای بحث شده تا اینجا را دربردارد.
#include <stdio.h> main() { unsigned int x = 48; /* 48 = 0011 0000 */ unsigned int y = 13; /* 13 = 0000 1101 */ int z = 0; z =x & y; /* 0 = 0000 0000 */ printf("Bitwise AND Operator - x & y = %d\n", z ); z = x | y; /* 61 = 0011 1101 */ printf("Bitwise OR Operator - x | y = %d\n", z ); z= x^y; /* 61 = 0011 1101 */ printf("Bitwise XOR Operator- x^y= %d\n", z); z = ~x; /*-61 = 1100 0011 */ printf("Bitwise One's Complement Operator - ~x = %d\n", z); z = x << 2; /* 192 = 1100 0000 */ printf("Bitwise Left Shift Operator x << 2= %d\n", z ); z= x >> 2; /* 12 = 0000 1100 */ printf ("Bitwise Right Shift Operator x >> 2= %d\n", z );}
پس از کامپایل و اجرای برنامه، خروجی زیر تولید می شود:
Bitwise AND Operator - x & y = 0 Bitwise OR Operator - x | y = 61 Bitwise XOR Operator- x^y= 61 Bitwise One's Complement Operator - ~x = -49 Bitwise Left Shift Operator x << 2= 192 Bitwise Right Shift Operator x >> 2= 12
خلاصه عملگرهای بیتی در C
- عملگرهای بیتی عملگرهای ویژه هستند که زبان C فراهم آورده است.
- این عملگرها در برنامه نویسی سطح بیت کاربرد دارند.
- این عملگرها برای دستکاری بیت های یک عبارت صحیح استفاده می شوند.
- عملگهای منطقی، شیف و مکمل سه نوع از عملگرهای بیتی هستند.
- عملگر مکمل بیتی برای معکوس کردن بیت های یک عبارت صحیح استفاده می شود.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
جواب مثال های شیفت اشتباه نوشته شده.
عملگر مکمل با عملگر not چه فرقی دارد؟
با سلام، در مورد مثال های شیفت ، مثال اولی جواب هاش بر عکسه.
مثال دوم هم در کامنت دوم ، یک صفر کم داره و 1010000 = 80 درسته.