عملگرهای بیتی برای اعمال تغییرات در بیت های یک عدد در زبان سی استفاده میشن و اگر میخواهید برنامه نویسی رجیستری رو یاد بگیرید حتما ، باید عملگرهای بیتی و کاربردشون رو بدونید. در این مقاله با عملگرهای بیتی و تمام کاربردهاشون در جریان بررسی چند مثالها آشنا میشید.
فهرست
– عملگر bitwise left shift و ضرب در توانهای 2
– عملگر bitwise right shift و تقسیم بر توانهای 2
– عملگر bitwise left shift و ساخت ماسک بیت
– عملگر bitwise OR و یک کردن بیت
– عملگر bitwise AND و چک کردن صفر یا غیر صفر بودن بیت
گیت های منطقی
قبل از اینکه به عملگر های بیتی بپردازیم قراره گیت های منطقی رو یادآدوری کنیم. گیت های منطقی که اینجا بررسی میکنیم یک یا دو ورودی و یک خروجی بیت دارند. هر بیت میتونه دو حالت داشته باشه، صفر یا یک.
گیت OR
گیت OR دو بیت ورودی داره و یک بیت خروجی. نتیجه ی OR وقتی یک هست که یکی از ورودی ها یا هر دو ورودی یک باشند و وقتی هر دو صفر باشند نتیجه صفر خواهد بود.
گیت AND
گیت AND هم دو بیت ورودی و یک بیت خروجی داره و نتیجه فقط وقتی یک هست که هر دو ورودی یک باشند. اگر یکی از ورودی ها یا هر دو صفر باشند نتیجه هم صفر خواهد بود.
گیت منطقی NOT
گیت NOT یک ورودی و یک خروجی داره ، اگر ورودی یک باشه، خروجی صفره و اگر ورودی صفر باشه، خروجی یک هست.
گیت منطقی XOR
گیت XOR دو ورودی و یک خروجی داره. اگر دو ورودی مشابه هم باشن، خروجی صفر میشه و اگر یکی از ورودی ها یک و دیگری صفر باشه خروجی یک میشه.
عملگرهای بیتی در زبان سی
عملگرهای بیتی برای انجام عملیات روی بیتهای اعداد استفاده میشن. در جدول زیر عملگرهای بیتی زبان سی رو میبینید و در ادامه با کاربردشون در برنامه نویسی آشنا میشید. برای اینکه برنامه نویسی رجیستری میکروکنترلرها رو یادبگیرید لازمه که روی عملگرهای بیتی مسلط باشید.
عملگر بیتی Bitwise NOT
این عملگر بیتی فقط یک operand داره. وقتی عددی رو Bitwise NOT کنیم وضعیت بیت های اون عدد عکس میشه. بیت هایی که یک هستند صفر میشن و بیت هایی که صفر هستند یک میشن. برای Bitwise NOT کردن یک عدد علامت ~ رو قبل از عدد مینویسیم.
عملگر بیتی Bitwise Shift
با استفاده از عملگر های شیفت مینونیم تمام بیت های یک عدد رو به چپ یا راست شیفت بدیم. ابتدا عددی که میخواهیم روش عملیات انجام بدیم مینویسیم، بعد عملگر left shift یا right shift و بعد تعداد شیفت رو مشخص میکنیم. در مثال زیر ابتدا عدد 35 رو در مبنای دو نوشتم. ابتدا 35 رو left shift دادم به مقدار 3 ، یعنی تمام بیت های عدد 3 تا به سمت چپ میرن که نتیجه ی این عملیات میشه 280 . در مثال بعدی عدد 35 رو 3 تا right shift دادم ، یعنی تمام بیت ها 3 تا به سمت راست میرن در اینجا 3 تا بیت کم ارزش عدد 35 از بین میرن و نتیجه ی عملیات ریاضی میشه عدد 4 .
عملگر بیتی Bitwise left shift و ضرب در توان های دو
عملگر left shift برای ضرب در توان های دو هم استفاده میشه. مثلا اگر عدد 35 رو که در مبنای دو میشه 100011 رو یک بار به سمت چپ شیفت بدیم مثل اینه که این عدد رو در 2 به توان 1 ضرب کردیم و نتیجه 70 میشه ، اگر 2 تا shift بدیم مثل اینه که در 2 به توان 2 یعنی 4 ضرب کردیم و نتیجه 140 میشه.
عملگر بیتی Bitwise right shift و تقسیم بر توان های دو
عملگر Right shift برای تقسیم بر توان های دو هم استفاده میشه. مثلا اگر عدد 140 رو که در مبنای دو میشه 10001100 رو یک بار به سمت راست شیفت بدیم مثل اینه که این عدد رو بر 2 به توان 1 تقسیم کردیم و نتیجه 70 میشه ، اگر 2 تا shift بدیم مثل اینه که بر 2 به توان 2 یعنی 4 تقسیم کردیم و نتیجه 35 میشه.
عملگر بیتی Bitwise left shift و ساخت ماسک بیت
برای تغییر بیت دلخواه در یک عدد، به ماسک بیت نیاز داریم. مثلا فرض کنید در یک عدد 32 بیتی میخواهیم بیت 5 رو ( میشه ششمین بیت، چون اولین بیت، بیت 0 هست ) یک یا صفر کنیم ، برای اینکار به ماسک بیت 5 نیاز داریم. ماسک بیت 5 یک عدد 32 بیتی هست که فقط بیت 5 در اون یک هست. برای تولید این عدد ، عدد 1 رو left shift پنج میدیم.
عملگر بیتی Bitwise OR
وقتی دو عدد رو با هم Bitwise OR میکنیم ، بیت های شماره صفر دو عدد با هم OR میشن و بیت صفر نتیجه رو میسازند. بیت های شماره یک با هم OR میشن و بیت یک نتیجه رو میسازند ، به همین ترتیب بیت های هم شماره با هم OR میشن و نتیجه رو میسازن.
عملگر بیتی Bitwise OR و یک کردن بیت در یک عدد
از عملگر Bitwise OR برای یک کردن یک یا تعدادی بیت در یک مقدار استفاده میشه.در این مثال قراره بیت چهار value رو یک کنیم، برای اینکار به ماسک بیت چهار نیاز داریم. ماسک بیت چهار عددیه که فقط بیت چهارش یک هست. مقدار بیت های value رو x گذاشتم، به این معنا که ممکنه صفر یا یک باشند و فرقی هم نمیکنه. وقتی value با mask رو Bitwise OR میکنیم همه ی بیت های value بغیر از بیت چهار با صفر OR میشن. وقتی x ها با صفر OR میشن، اگر بیت x صفر باشه، نتیجه صفر میشه، اگر بیت x یک باشه نتیجه یک میشه. پس صفر یا یک وقتی با صفر OR میشن، نتیجه خودش میشه. ولی بیت چهار با یک OR میشه، اگر بیت چهار یک باشه، نتیجه یک هست و اگر بیت چهار صفر باشه باز هم نتیجه یک هست. در نتیجه عددی داریم که تمام بیت هاش بغیر از بیت چهار مشابه value هست و فقط بیت چهار تغییر کرده و صفر شده. برای تغییر مقدار value میتونیم نتیجه رو در value ذخیره کنیم و اینطوری بیت چهار رو در value یک کردیم. عبارت value = value | mask رو میتونیم به شکل value |= mask بنویسیم.
عملگر بیتی Bitwise OR و یک کردن بیت در یک عدد – مثال دوم
در این مثال دوم قراره بیت چهار و یازده value رو یک کنیم، ماسک بیت در اینجا عددی هست که بیت چهار ویازده در اون یک هستند. برای ساخت این ماسک باید ماسک بیت چهار و ماسک بیت یازده رو با هم OR کنیم. بقیه عملیات مشابه مثال قبل هست.
عملگر بیتی Bitwise AND
وقتی دو عدد رو با هم Bitwise AND میکنیم ، بیت های شماره صفر دو عدد با هم AND میشن و بیت صفر نتیجه رو میسازند. بیت های شماره یک با هم AND میشن و بیت یک نتیجه رو میسازند ، به همین ترتیب بیت های هم شماره با هم AND میشن و نتیجه رو میسازن.
عملگر بیتی Bitwise AND و چک کردن صفر یا غیر صفر بودن بیت در یک عدد
خیلی وقتها در برنامه نویسی میکروکنترلر ها نیاز داریم بدونیم یک یا تعدادی بیت در یک عدد چه وضعیتی دارند، برای اینکار از عملگر بیتی Bitwise AND استفاده میکنیم. فرض کنید میخواهیم با استفاده از if ، اگر بیت چهار value یک باشه ، یک بلوک کد اجرا بشه. داخل پرانتر if چی باید بنویسیم؟
اگر عبارت داخل پرانتر if صفر باشه ، بلوک کد بعد از if اجرا نمیشه و اگر غیر صفر باشه، یعنی شرط درسته و بلوک کد اجرا میشه.
اگر value رو با ماسک بیت چهار bitwise AND کنیم. تمام بیت ها بغیر از بیت چهار با صفر AND میشن و یک یا صفر وقتی با صفر AND میشه، نتیجه صفر میشه. ولی بیت چهار با یک AND میشه ، اگر بیت چهار یک باشه، نتیجه یک میشه و اگر صفر باشه نتیجه صفر میشه یعنی بیت چهار تغییر نمیکنه. در نتیجه عددی داریم که بغیر از بیت چهار بقیه بیت هاش صفر هست و بیت چهارش مشابه بیت چهار value هست.
اگر result صفر باشه، یعنی بیت چهار value هم صفر بوده و اگر result غیر صفر باشه یعنی بیت چهار value یک بوده.
عملگر بیتی Bitwise AND و صفر کردن بیت در یک عدد
فرض کنید قراره بیت 23 در عدد value رو صفر کنیم. برای اینکار به عددی نیاز داریم که بیت 23 در اون صفر باشه و بقیه بیت ها یک باشه (بر عکس ماسک بیت 23 که تمام بیت هاش بغیر از بیت 23 صفر هست). اگر این عدد رو با عدد value رو Bitwise AND کنیم، تمام بیت ها بغیر از بیت 23 با یک AND میشن و صفر یا یک وقتی با یک AND بشه نتیجه خودش میشه. ولی بیت 23 با صفر AND میشه و نتیجه صفر میشه. پس در نتیجه عددی داریم که بغیر از بیت 23 ، تمام بیتهاش مشابه بیتهای value هستند و فقط بیت 23 صفر شده. میتونیم این عدد رو در value ذخیره کنیم و اینطوری بیت 23 عدد value رو صفر کردیم.
حالا چطوری باید عددی بسازیم که بیت 23 در اون صفر هست و بقیه بیت ها یک؟
در ماسک بیت 23 تمام بیت ها بغیر از بیت 23 صفر هستند و بیت 23 یک هست . اگر ماسک بیت رو NOT کنیم وضعیت بیت هاش برعکس میشه ، صفر ها یک میشن و یک ها صفر. اینطوری عددی خواهیم داشت که بیت 23 در اون صفر هست و بقیه بیت ها یک.
عملگر بیتی Bitwise XOR و toggle کردن بیت
وقتی در عدد رو با هم Bitwise XOR میکنیم ، بیت های هم ارزش دونه دونه با هم XOR میشن و نتیجه رو میسازند. Toggle کردن یک بیت یعنی وضعیت بیت رو عکس کنیم، یعنی اگر بیت صفر هست یک میشه و اگر یک هست صفر میشه. در این مثال قراره وضعیت بیت چهار در عدد value رو toggle کنیم.
ابتدا باید عدد value رو با ماسک بیت چهار Bitwise XOR کنیم. وقتی دو بیت با هم XOR میشن ، اگر هم ارزش باشند ، یعنی هر دو صفر یا هر دو یک باشند ، نتیجه صفر میشه ولی اگر یکی از بیت ها صفر و دیگری یک باشه ، نتیجه یک میشه. همه ی بیت های value بغیر از بیت چهار با صفر XOR میشن. اگر x صفر یا یک باشه ، نتیجه صفر میشه ولی بیت چهار با یک XOR میشه . اگر بیت چهار یک باشه. یک XOR یک میشه صفر و اگر بیت چهار صفر باشه ، صفر XOR یک میشه یک ، پس نتیجه ی XOR بیت چهار value با یک میشه عکس بیت چهار.
در نتیجه عددی داریم که بغیر از بیت چهار بقیه بیت هاش مشابه بیت های value هستند و بیت چهار value عکس شده. برای toggle کردن بیت چهار value میتونیم نتیجه ی عملیات رو در value ذخیره کنیم.