2016-08-12 16 views
17

मैं असाइनमेंट करने की कोशिश कर रहा हूं: "sizeof() फ़ंक्शन का उपयोग किए बिना एक हस्ताक्षरित पूर्णांक डेटा प्रकार में बिट्स की संख्या पाएं।"क्या है (x और 1) और (x >> = 1)?

और मेरा डिज़ाइन पूर्णांक को बिट्स में परिवर्तित करना है और फिर उन्हें गिनना है। पूर्व के लिए:

do 
{ 
    Vec.push_back(x & 1) 
} 
while (x >>= 1); 

मैं सिर्फ पेस्ट सामान नकल नहीं करना चाहती: 10 is 1010 और 5 is 101

Converting integer to a bit representation कुछ इस तरह पता चलता है। जब मैं एफ -10 का उपयोग करता हूं तो मुझे लगता है कि (x & 1) क्या कर रहा है लेकिन मुझे नहीं पता कि यह नाम है या यह कैसे काम करता है (कुछ की तुलना करें?)। इसके अलावा मुझे >= पता है जो "से अधिक या बराबर" है लेकिन x >>= 1 क्या है?

नोट: उल्लेखनीय डुप्लिकेट एक जावास्क्रिप्ट और नहीं सी ++

+6

"यह प्रश्न शोध प्रयासों को दिखाता है; यह उपयोगी और स्पष्ट है" तो [** कठोर टिप्पणियों के साथ क्या हो रहा है? **] (http://meta.stackexchange.com/questions/15143/whats-with-all- अशिष्ट-टिप्पणियां-हाल ही में/15144) और डाउनवॉट्स ?! –

+8

मैं सभी डाउनवॉट्स को समझ नहीं पा रहा हूं। '&', '>> =', और अन्य ऑपरेटरों को इंटरनेट पर खोजना बेहद मुश्किल है। प्रश्न किसी ऐसे व्यक्ति के लिए आसान है जिसने इन ऑपरेटरों को पहले देखा है, लेकिन वे आत्म-व्याख्यात्मक नहीं हैं, और जब आप उन्हें पहली बार देखते हैं तो काफी भारी हो सकता है। – dasblinkenlight

+6

अच्छा शीर्षक। बहुत स्पष्ट सवाल है। एक पाठ्य पुस्तक के साथ काफी आसान है लेकिन ऑनलाइन संसाधनों का उपयोग करने में कठिनाई के साथ। शायद अपरिवर्तनीय नहीं है, लेकिन निश्चित रूप से प्राप्त टारपीडो बमबारी के योग्य नहीं है। – user4581301

उत्तर

20

ये बिटवाइज़ ऑपरेटर्स (reference) कर रहे हैं।

x & 1 वह यह है कि या तो 1 या 0, x के कम से कम महत्वपूर्ण बिट के आधार पर एक मूल्य पैदा करता है: अगर पिछले बिट 1 है, x & 1 का परिणाम 1 है; अन्यथा, यह 0 है। यह थोड़ा सा और ऑपरेशन है।

x >>= 1 का अर्थ है "सेट x स्वयं को एक बिट से दाएं स्थानांतरित करने के लिए सेट करें"। अभिव्यक्ति शिफ्ट के बाद x के नए मान का मूल्यांकन करती है।

नोट: शिफ्ट के बाद सबसे महत्वपूर्ण बिट का मान हस्ताक्षर किए गए प्रकार के मानों के लिए शून्य है। हस्ताक्षर किए गए प्रकार के मूल्यों के लिए साइन एक्सटेंशन के हिस्से के रूप में स्थानांतरित करने से पहले मूल्य के साइन बिट से सबसे महत्वपूर्ण बिट की प्रतिलिपि बनाई गई है, इसलिए अगर x हस्ताक्षरित प्रकार है, तो लूप कभी खत्म नहीं होगा, और प्रारंभिक मान नकारात्मक है।

+4

_'x >> = 1 का अर्थ है "एक्स एक बिट से दाएं स्थानांतरित हो गया" .__ नहीं, इसका मतलब है उस से भी अधिक। –

+1

हाय और धन्यवाद। क्या आप कृपया अधिक जानकारी दे सकते हैं (अंतिम बिट के आधार पर) और (एक से दाईं ओर स्थानांतरित)? –

+0

मुझे संदेह है कि @MaximEgorushkin संकेत दे सकता है [यह कार्यान्वयन-परिभाषित किया गया है कि नकारात्मक संख्याओं की सही बदलाव शून्य में आती है या शीर्ष बिट में से एक] [http://stackoverflow.com/questions/7622/are-the- बदलाव ऑपरेटरों-गणित या तार्किक-इन-सी)। –

3

यह x = (x >> 1) के समान है।

(operand1)(operator)=(operand2) implies(=>) (operand1)=(operand1)(operator)(operand2) 

यह एक्स के बाइनरी मान को एक से दाएं स्थानांतरित करता है।

उदा।

int x=3; // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right: 
      // x=1, binary form (001) 
2

"dasblinkenlight" के जवाब के अलावा मुझे लगता है कि एक उदाहरण मदद कर सकता है। मैं बेहतर समझ के लिए केवल 8 बिट्स का उपयोग करूंगा।

x & 1 है कि या तो 1 या 0 है, x के कम से कम महत्वपूर्ण बिट के आधार पर एक मूल्य पैदा करता है: अगर पिछले बिट 1 है, x & 1 का परिणाम 1 है; अन्यथा, यह 0 है। यह थोड़ा सा और ऑपरेशन है।

ऐसा इसलिए है क्योंकि 100000001 के रूप में बिट्स में प्रदर्शित किया जाएगा। केवल अंतिम बिट 1 पर सेट है।आइए मान लें कि x185 है जो बिट्स में 10111001 के रूप में प्रदर्शित किया जाएगा। आप 1 साथ x पर एक बिटवाइज़ और कार्रवाई लागू यदि यह परिणाम होगा:

00000001 
10111001 
-------- 
00000001 

आपरेशन परिणाम के पहले सात बिट्स होगा ऑपरेशन के बाद 0 और (Logical AND operation देखें) इस मामले में कोई जानकारी नहीं ले जाएगा । क्योंकि ऑपरेटिंग के बाद ऑपरेटिंग के बाद ऑपरेटर x के पहले सात बिट्स पहले थे, वे 0 होंगे। लेकिन ऑपरेटिंग 1 का अंतिम बिट 1 है और यह बताएगा कि ऑपरेंड x का अंतिम बिट 0 या 1 था। तो इस उदाहरण में बिटवाई और ऑपरेशन का परिणाम 1 होगा क्योंकि x का हमारा अंतिम बिट 1 है। पिछले बिट 0 हो गया होता, तो परिणाम भी 0 हो गया होता, यह दर्शाता है कि संकार्य x के अंतिम बिट 0 है:

00000001 
10111000 
-------- 
00000000 

x >>= 1 का अर्थ है "सेट x ही करने के लिए एक बिट से स्थानांतरित कर दिया सही"। अभिव्यक्ति बदलाव के बाद x के नए मूल्य का आकलन करती

ऊपर से एक उदाहरण चुनने दें। x >>= 1 के लिए यह होगा:

10111001 
-------- 
01011100 

और बाईं पारी x <<= 1 के लिए यह होगा:

10111001 
-------- 
01110010 

कृपया ध्यान उपयोगकर्ता "dasblinkenlight" की टिप्पणी के संबंध में बदलाव करने के लिए भुगतान करते हैं।

+0

ग्रेट स्पष्टीकरण। धन्यवाद! क्या आप एक बुनियादी यथार्थवादी समस्या दिखा सकते हैं जिसे इन ऑपरेटरों द्वारा हल किया जा सकता है? ओपी में उदाहरण के अलावा? कृपया और धन्यवाद –

+0

उदा। आप एक इंटीजर के बिट्स को उलट करने के लिए दोनों ऑपरेटर का उपयोग कर सकते हैं। इसका पहला उदाहरण देखें: [रिवर्स बिट्स ऑफ इंटेगर] (http://www.techiedelight.com/reverse-bits-of-given-integer/)। पहले उदाहरण में दोनों ऑपरेटर का उपयोग किया जाएगा। और शिफ्ट ऑपरेटर गुणा और विभाजन के लिए बहुत आसान हैं 2: [शिफ्ट ऑपरेटरों का उपयोग 2 से गुणा और विभाजित करने के लिए करें] (http://www.java2s.com/Code/CSharp/Language-Basics/Usetheshiftoperatorstomultiplyanddivideby2.htm) – stackomatiker

1

x & 1x % 2 के बराबर है।

x >> 1 तो, इन बातों को मूल रूप से परिणाम और दो से विभाजित के शेष हैं x/2

के बराबर है।

संबंधित मुद्दे