عملیات بیتی

در برنامه‌نویسی رایانه‌های دیجیتالی، عملیات بیتی(به انگلیسی bitwise operation)، به انجام عملیات مختلف بر روی تک تک بیت‌های یک عدد دودویی یا هر الگوی بیتی دیگری گفته می‌شود. این کار به منظور محاسبه و مقایسه مقادیر مختلف انجام می‌شود و یک عملیات سریع است و مستقیماً توسط پردازنده پشتیبانی می‌شود. در یک پردازنده ساده و ارزان قیمت، به‌طور معمول، عملیات بیتی به شکل قابل ملاحظه‌ای سریعتر از تقسیم، چند برابر سریعتر از ضرب و گاهی به طرز چشمگیری سریعتر از جمع است. حتی در یک پردازنده مدرن و گرانقیمت که ضرب و جمع را به همان سرعت عملیات بیتی انجام می‌دهد، عملیات بیتی معمولاً منابع کمتری مصرف می‌کنند و استفاده از آن‌ها به صرفه تر است.

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

NOT 
نفی بیتی یا مکمل، یک عملگر یگانی است که هر بیت را به صورت منطقی نقیض می‌کند و به این ترتیب مکمل یک آن مقدار بدست می‌آید. بیت‌هایی که ۰ هستند تبدیل به ۱ و بیت‌هایی که ۱ هستند تبدیل به صفر می‌شوند. برای مثال:

 NOT 0111 (decimal 7)
= 1000 (decimal 8)

مکمل بیتی یک مقدار، با یکی کمتر از مکمل دو آن عدد برابر است:

NOT x = −x − 1

AND 
عملگر AND بیتی، دو مقدار دودویی با طول مساوی دریافت کرده و بر روی هر جفت بیت متناظر، عملیات عطف منطقی را انجام می‌دهد. نتیجه وقتی ۱ می‌شود که اولین بیت و دومین بیت هر دو با هم ۱ باشند. در غیر این صورت نتیجه صفر است. در اینجا ضرب دو مقدار را با هم مرور می‌کنیم. ۱ * ۰ = ۰ و ۱ * ۱ = ۱:

  0101 (decimal 5)
 AND 0011 (decimal 3)
= 0001 (decimal 1

با استفاده از عملیات AND بیتی، می‌توان تشخیص داد که آیا یک بیت خاص تنظیم شده‌است (یعنی ۱ است) یا نه (یعنی ۰ است). برای مثال در الگوی ۰۰۱۱ (عدد ۳ دودویی) برای اینکه تشخیص دهیم آیا دومین بیت تنظیم شده‌است یا نه، آن را با الگویی که تنها دومین بیت آن ۱ است AND می‌کنیم.

  0011 (decimal 3)
 AND 0010 (decimal 2)
   = 0010 (decimal 2)

از آنجا که نتیجه عملیات صفر نشد(۰۰۱۰)، ما نتیجه می‌گیریم که دومین بیت در الگوی اصلی تنظیم شده‌است. (۱ است)

اگر نتیجه را در جایی ذخیره کنیم، می‌توانیم از طریق آن بیت مورد نظر را در یک ثبات پاک کنیم (صفر کنیم) مثلاً اگر الگوی ۰۱۱۰ (عدد ۶ دودویی) را با الگویی که تنها دومین بیت آن صفر است AND کنیم، می‌توانیم بیت دوم را پاک کنیم.

  0110 (decimal 6)
 AND 1101 (decimal 13)
= 0100 (decimal 4)

OR 
عملگر OR بیتی، دو الگوی بیتی با طول یکسان دریافت کرده و عملیات فصل منطقی را بر روی بیت‌های متناظر انجام می‌دهد. نتیجه عملیات ۱ است، اگر بیت اول یا بیت دوم یک باشند. در غیر این صورت (یعنی اگر هر دو بیت صفر باشند) نتیجه عملیات هم صفر است.

  0101 (decimal 5)
 OR 0011 (decimal 3)
= 0111 (decimal 7)

XOR 
عملگر XOR بیتی، دو الگوی بیتی با طول یکسان دریافت کرده و عملیات یای انحصاری را بر روی بیت‌های متناظر انجام می‌دهد. نتیجه وقتی ۱ است که اگر فقط اولین بیت ۱ باشد یا فقط دومین بیت ۱ باشد. اما اگر هر دو بیت صفر یا هر دو بیت ۱ باشند، نتیجه صفر است.

  0101 (decimal 5)
 XOR 0011 (decimal 3)
= 0110 (decimal 6)

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

شیفت محاسباتی 

در عمل شیفت محاسباتی، بیت‌هایی که از یک طرف ثبات به بیرون پرت می‌شوند، از بین می‌روند. در عمل شیفت به سمت چپ، از سمت راست ثبات، صفر وارد می‌شود. در عمل شیفت به سمت راست، بیت علامت از طرف چپ وارد ثبات می‌شود. در نتیجه علامت عدد حفظ می‌شود. اگر عدد مثبت باشد، مثبت باقی خواهد ماند و اگر منفی باشد، منفی باقی می‌ماند. به علاوه، در هنگام شیفت به سمت راست، فضاهای خالی با یک کپی از بیت پرازش (MSB) پر می‌شوند. مثال زیر از یک رجیستر ۸ بیتی استفاده می‌کند:

  00010111 (decimal +23) LEFT-SHIFT
= 00101110 (decimal +46)

  10010111 (decimal −105) RIGHT-SHIFT
 = 11001011 (decimal −53)

در مورد اول، که یک عمل شیفت به سمت چپ است، سمت چپ‌ترین بیت، از ثبات خارج شده و یک صفر جدید از سمت راست وارد ثبات می‌شود. در مورد دوم، که یک عمل شیفت به سمت راست است، سمت راست‌ترین ۱، به بیرون پرت شده، (ممکن است در بیت کری قرار گیرد) و یک ۱ جدید، با حفظ بیت علامت، در سمت چپ‌ترین مکان قرار می‌گیرد. نکته اصلی شیفت محاسباتی این است که در این نوع شیفت، بیت علامت حفظ می‌شود.

شیفت منطقی 

در این نوع شیفت، جای خالی بیت‌های از بین رفته با صفر پر می‌شود. در نتیجه شیفت منطقی با شیفت محاسباتی به سمت چپ برابر است. با این حال از آنجا که در شیفت منطقی به سمت راست، به جای کپی کردن بیت علامت، بیت صفر به جای پرارزشترین بیت می‌نشیند، این نوع شیفت بیشتر برای اعداد بدون علامت مناسب است. در حالی که شیفت محاسباتی به سمت راست مکمل دو اعداد علامت‌دار مناسب است.

منابع 

واز جزوه دانیال خشابی

جبر بولی
عملگرها (برنامه‌نویسی)
محاسبه اعداد دودویی