bitwise.dspworld.ir
عملگرهای بیتی در C

Dspworld.ir

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

زمان مطالعه: 3 دقیقه
این مقاله ادامه مجموعه آموزش برنامه نویسی C است و بحث برنامه نویسی زبان C و پیاده سازی آن را در بر می گیرد. هدف این آموزش یادگیری و مرور مجدد زبان برنامه نویسی C با رویکرد سیستمهای امبدد میباشد.

فهرست مطالب

عملگرهای بیتی در C :

در آخرین آموزش ما در مورد عملگرها در برنامه نویسی C بحث کردیم. در قسمت قبل، فقط عملگرهای بیتی را بررسی نکردیم. بنابراین در این قسمت از آموزش قصد داریم در مورد عملگرهای بیتی در C صحبت کنیم.

 عملگرهای بیتی در C موضوع مهم برای مصاحبه و استخدام در حوزه سیستمهای تعبیه شده است. عنوان این قسمت از آموزش را دستکاری بیتها در C نیز میتوانیم نامگذاری کنیم.

عملگرهای بیتی در برنامه نویسی C

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

عملگر
کاربرد عملگر
&
AND بیتی
|
OR بیتی
^
XOR بیتی
~
مکمل بیتی
شیفت به چپ
>>
شیفت به راست
<<

در آخرین آموزش ما در مورد عملگرها در برنامه نویسی C بحث کردیم. در قسمت قبل، فقط عملگرهای بیتی را بررسی نکردیم. بنابراین در این قسمت از آموزش قصد داریم در مورد عملگرهای بیتی در C صحبت کنیم.

 عملگرهای بیتی در C موضوع مهم برای مصاحبه و استخدام در حوزه سیستمهای تعبیه شده است. عنوان این قسمت از آموزش را دستکاری بیتها در C نیز میتوانیم نامگذاری کنیم.

عملگر بیتی AND (&) :

خروجی بیتی AND یک است اگر بیت های متناظر هر دو عملوند 1 باشند. اگر هر یک از بیت های یک عملوند 0 باشد، نتیجه بیت مربوطه 0 ارزیابی می شود.

برای بهتر فهمیدن موضوع بیاید با هم یک مثال رو بررسی کنیم، عملیات بیتی AND دو عدد صحیح 36 و 13.

عملگرهای بیتی در برنامه نویسی C

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

				
					36 = 00100100 (In Binary)
13 = 00001101  (In Binary)

Bit Operation of 36 and 13

00100100
00001101                          (&)
________________
00000100 = 4 (In decimal)
				
			

عملکر بیتی OR (|) :

خروجی OR بیتی 1 است اگر حداقل یک بیت متناظر از دو عملوند 1 باشد. در برنامه نویسی C، عملگر OR بیتی با | نشان داده می شود.

مثال زیر رو با دقت بررسی کنید، عملیات بیتی OR دو عدد صحیح 36 و 13.

				
					36 = 00100100 (In Binary)
13 = 00001101  (In Binary)

Bit Operation of 36 and 13

00100100
00001101                          (|)
________________
00101101 = 45 (In decimal)
				
			

اپراتور  بیتی XOR (OR انحصاری) (^):

نتیجه عملگر XOR بیتی 1 است اگر بیت های متناظر دو عملوند مخالف هم باشند. با ^ نشان داده می شود.

				
					36 = 00100100 (In Binary)
13 = 00001101  (In Binary)

Bit Operation of 36 and 13

00100100
00001101                          (^)
________________
00101001 = 41 (In decimal)
				
			

عملگر مکمل بیتی (~) :

عملگر متمم بیتی یک عملگر یوناری یا یگانه میباشد. (فقط روی یک عملوند کار می کند). 1 را به 0 و 0 را به 1 تغییر می دهد. و با ~ نشان داده می شود.

عملگر شیفت به راست :

عملگر Right Shift همه بیت ها را با تعداد معینی از بیت های مشخص شده به سمت راست تغییر می دهد.و با  <<  نشان داده می شود.

				
					212 = 11010100 (In binary)
212>>2 = 00110101 (In binary) [Right shift by two bits]
212>>7 = 00000001 (In binary)
212>>8 = 00000000
212>>0 = 11010100 (No Shift)
				
			

عملگر شیفت به چپ :

عملگر شیفت به چپ همه بیت ها را با تعداد معینی از بیت های مشخص شده به سمت چپ تغییر می دهد. با >> نشان داده می شود.

				
					212 = 11010100 (In binary)
212<<1 = 110101000 (In binary) [Left shift by one bit]
212<<0 =11010100 (Shift by 0)
212<<4 = 110101000000 (In binary) =3392(In decimal)
				
			

همه آن چیزی که مربوط به عملگر بیتی است رو در چند خط بالا با هم بررسی کردیم.همین چند خط ساده در برنامه نویسی میکروکنترلر یا DSP و یا هر پردازنده دیگه ای بسیار بسیار کاربردی میباشد. و اگه برای مصاحبه به شرکتهای معتبر برید حتی ممکنه سوالاتی هم ازتون بپرسن.

تو ادامه با هم چندتا از سوالاتی که ممکنه ازتون پرسیده بشه رو باهم بررسی میکنیم.

ممنون که با ما همراهید.

عملگرهای بیتی در C - سوالات مصاحبه :

چگونه یک بیت خاص را در یک متغیر یا رجیستر تنظیم کنیم ؟

برای ست کردن هر بیت در یک متغیر، از عملگر OR استفاده کنید.

				
					Variable = Variable | (1<<x)   (or)   Variable |= (1<<x)


				
			

در اینجا “x” موقعیت بیت را نشان می دهد.

مثال: بیت چهارم را در ثبات A تنظیم کنید.

				
					A = A | (1<<4)  (or)  A |= (1<<4) 


				
			

چگونه یک بیت خاص را در یک عدد پاک کنیم؟

برای پاک کردن هر بیت در یک متغیر، از عملگرهای (AND ) و (مکمل(~)) استفاده کنید.

				
					Variable = Variable & ~(1<<x)    (or)    Variable &= ~(1<<x)


				
			

“x” موقعیت بیت را نشان می دهد

مثال: بیت پنجم را در ثبات B پاک کنید.

				
					B = B & ~(1<<5)     (or)      B &= ~(1<<5) 


				
			

چگونه می توان یک بیت خاص را در یک عدد تغییر داد یا ورق زد؟

برای جابجایی هر بیت در یک متغیر، از عملگر OR انحصاری (^) استفاده کنید.

				
					Variable = Variable ^ (1<<x)    (or)     Variable ^= (1<<x)   


				
			

“x” موقعیت بیت را نشان می دهد

مثال: بیت دوم را در ثبات B داده شده تغییر دهید.

				
					B = B ^ (1<<2)       (or)        B ^= (1<<2)


				
			

یک محدوده معین از بیت ها را تغییر دهید
به عنوان مثال، عدد 245 را در نظر بگیرید. فرمت باینری معادل 1111101 و  میخواهیم بیت 4 تا 7 رو صفر کنیم که این کار عدد 245 رو به  00000101 تبدیل میکند و معادل 5 در سیستم اعداد دهدهی میشود است.

				
					unsigned int rangeToggle(unsigned int num, unsigned int i , unsigned int j)
{
  return num ^ ((1<<(j-i)+1)-1)<<i;
}
				
			

چگونه بررسی کنیم بیت خاص در یک عدد تنظیم شده است یا نه؟

برای بررسی هر بیت در یک متغیر، از عملگر (&)  استفاده میکنیم.

				
					Variable & (1<<x)
				
			

x” موقعیت بیت را نشان می دهد.

مثال: بررسی کنید که آیا بیت 3 تنظیم شده است یا خیر.

				
					if((variable & (1<<3)) == 0) 
{
    printf("bit is not set");
} 
else 
{
    printf("bit is set");
}
				
			

استفاده از ماکرو برای پیاده سازی عبارات بیتی :

ما میتوانیم با استفاده از ماکروها در زبان برنامه نویسی C عبارات بالا را تعریف و مکررا در کد خودمون استفاده کنیم.مثالهایی که در ادامه مینوسیم رو حتما در کتابخانه های پردازنده ها دیده اید یا خواهید دید.

				
					#define SET_BIT(Variable, bit_position)    Variable |= (1<< bit_position) 
#define CLEAR_BIT(Variable, bit_position)    Variable &= ~(1<< bit_position) 
#define TOGGLE_BIT(Variable, bit_position)    Variable ^= (1<< bit_position) 
#define CHECK_BIT_IS_SET_OR_NOT(Variable, bit_position)    Variable & (1<< bit_position)
				
			

برای تعویض بایت ها در متغیر عدد صحیح 16 بیتی،یک MACRO تعریف کنید.

				
					#define ByteSwap16(Value) ((Value & 0x00FF) << 8) | ((Value & 0xFF00) >> 8)
				
			

برای تعویض بایت ها در یک متغیر عدد صحیح 32 بیتی،یک MACRO تعریف کنید.

				
					#define ByteSwap32(Value) ((Value & 0x000000FF) << 24) |
                                  ((Value & 0x0000FF00U) <<  8) |
                                  ((Value & 0x00FF0000U) >>  8) |
                                  ((Value & 0xFF000000U) >> 24)
				
			

برای تعویض بایت ها در یک متغیر عدد صحیح 64 بیتی، یک MACRO بنویسید.

				
					#define ByteSwap64(Value)   ((Value & 0x00000000000000FFU) << 56) | 
                                ((Value & 0x000000000000FF00U) << 40) | 
                                ((Value & 0x0000000000FF0000U) << 24) | 
                                ((Value & 0x00000000FF000000U) <<  8) | 
                                ((Value & 0x000000FF00000000U) >>  8) | 
                                ((Value & 0x0000FF0000000000U) >> 24) | 
                                ((Value & 0x00FF000000000000U) >> 40) | 
                                ((Value & 0xFF00000000000000U) >> 56)
				
			

فرد یا زوج بودن عدد را پیدا کنید.

				
					void odd_even( uint8_t  number )
{
  if( number & 1 )
  {
    printf(" Number is Odd\r\n");
  }
  else
  {
    printf(" Number is Even\r\n");
  }
}
				
			

اخرین بیت ست سمت راست را صفر کنید.

به عنوان مثال، عدد 144 را در نظر بگیرید. فرمت باینری معادل 10010000 است. بنابراین، خروجی باید 10000000 باشد که معادل 128 در سیستم دهدهی میباشد.

				
					uint8_t remove_last_set_bit( uint8_t  number )
{
    return (number & (number - 1));
}
				
			

بررسی کنید که آیا عدد توان 2 است یا خیر.

				
					void powerOf2( uint8_t  number ) 
{
  if(number & (number - 1))
  {
    printf("Number is not power Of 2");
  }
  else
  {
    printf("Number is power Of 2");
  }
}
				
			

تعداد بیت های ست را در یک عدد بشمارید

				
					unsigned int countSetBits( unsigned int number ) 
{
  unsigned int count = 0;
  while( number != 0)
  {
    count++;
    number &= (number-1);
  }

  return count;
}
				
			

دو بیت را در یک موقعیت معین در یک عدد صحیح عوض کنید.

				
					unsigned int swapBits( unsigned int number, unsigned int i, unsigned int j ) 
{
  number ^= (1 << i);
  number ^= (1 << j);
  
  return number;
}
				
			

همه بیت های زوج و فرد را عوض کنید.

به عنوان مثال، عدد 154 را در نظر بگیرید. فرمت باینری معادل 10011010 است. بنابراین، خروجی باید 01100101 باشد که معادل 101 در سیستم دهدهی میباشد.

				
					unsigned int swapOddEvenBits( unsigned int number ) 
{
  return ( ( number & 0xAAAAAAAA ) >> 1 ) | ( ( number & 0x55555555 ) << 1 );
}
				
			

امیدوارم از آموزشها تا اینجا لذت کافی برده باشد.

حتما خودتون هم مثالهارو تست و تمرین کنید تا دستتون راه بیوفته. تو آموزش بعدی انواع داده ها را در زبان برنامه نویسی C بررسی خواهید کرد.

حتما صفحه مارو در اینستاگرام دنبال کنید تا از انتشار قسمتهای جدید زودتر از بقیه مطلع بشید