बिटवाइज़ शिफ्ट ऑपरेटर्स हैं: राइट-शिफ्ट ऑपरेटर (>>), जो shift_expression के बिट्स को दाईं ओर ले जाता है, और लेफ्ट-शिफ्ट ऑपरेटर (<<), जो shift_expression के बिट्स को बाईं ओर ले जाता है।
लेफ्ट-शिफ्ट ऑपरेटर shift-expression में बिट्स को additive-expression द्वारा निर्दिष्ट पदों की संख्या से बाईं ओर शिफ्ट करता है। शिफ्ट ऑपरेशन द्वारा खाली किए गए बिट पोजिशन्स जीरो-फिल्ड होते हैं। लेफ्ट शिफ्ट एक लॉजिकल शिफ्ट है (अंत से शिफ्ट हुए बिट्स डिस्कार्ड हो जाते हैं, साइन बिट सहित)।
राइट-शिफ्ट ऑपरेटर shift-expression में बिट पैटर्न को additive-expression द्वारा निर्दिष्ट पदों की संख्या से दाईं ओर शिफ्ट करता है। अनसाइन्ड नंबर्स के लिए, शिफ्ट ऑपरेशन द्वारा खाली किए गए बिट पोजिशन्स जीरो-फिल्ड होते हैं। साइन्ड नंबर्स के लिए, साइन बिट का उपयोग खाली बिट पोजिशन्स को भरने के लिए किया जाता है। दूसरे शब्दों में, यदि संख्या पॉजिटिव है, तो 0 उपयोग किया जाता है, और यदि नंबर नेगेटिव है, तो 1 उपयोग किया जाता है।
उदाहरण
#include<iostream>
using namespace std;
int main() {
int a = 1, b = 3;
// a अभी 00000001 है
// इसे 3 से लेफ्ट शिफ्ट करने पर 00001000 बनेगा, यानी 8
a = a << 3;
cout << a << endl;
// a को 2 से राइट शिफ्ट करने पर 00000010 बनेगा, यानी 2
a = a >> 2;
cout << a << endl;
return 0;
}
आउटपुट
इससे आउटपुट मिलेगा –
8 2
ध्यान दें कि ये ऑपरेटर्स नेगेटिव नंबर्स के साथ बहुत अलग व्यवहार करते हैं। साइन्ड नेगेटिव नंबर के राइट-शिफ्ट का परिणाम इम्प्लीमेंटेशन-डिपेंडेंट होता है। यदि आप साइन्ड नंबर को इतना लेफ्ट-शिफ्ट करते हैं कि साइन बिट प्रभावित हो, तो परिणाम अनडिफाइंड होता है।
ऐसे 2 कंपाउंड ऑपरेटर्स भी हैं जिनका उपयोग मान को सीधे बाएं वाले मान पर असाइन करने के लिए किया जा सकता है। ये <<= ऑपरेटर और >>= ऑपरेटर हैं।
शिफ्ट ऑपरेटर्स के अधिक विस्तृत निरीक्षण के लिए यहां देखें।