2012-06-10 20 views
7

मुझे बिटवाई ऑपरेटरों की एक बहुत ही बुनियादी समझ है। मुझे यह समझने में कमी है कि मूल्य को कैसे आवंटित किया जाता है। अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं बहुत आभारी रहूंगा।हेक्स वैल्यू को बिटवाईड का उपयोग कैसे किया जाता है?

मेरे हेक्स पता: 0xE0074000

दशमलव मूल्य: 3758571520

बाइनरी मान: 11100000000001110100000000000000

मैं एक साधारण माइक्रो नियंत्रक कार्यक्रम और माइक्रोसॉफ्ट में रजिस्टर का उपयोग कक्षा उपयोग करने के लिए कोशिश कर रहा हूँ। नियंत्रक बनाने के लिए नेट माइक्रो फ्रेमवर्क जो मैं करना चाहता हूं वह करता हूं।

Register T2IR = new Register(0xE0074000); 
T2IR.Write(1 << 22); 

मेरे उपरोक्त उदाहरण में, बाइनरी प्रतिनिधित्व में बिट्स कैसे स्थानांतरित हो गए हैं? मुझे समझ में नहीं आता कि बिट्स के प्रबंधन को बाइनरी फॉर्म में पते पर कैसे सौंपा गया है।

अगर कोई मुझे सही दिशा में इंगित कर सकता है तो मैं बहुत ही शानदार होगा।

उत्तर

9

शुरुआत के लिए दशमलव के बारे में भूल जाओ। आप बाद में वापस आ जाएंगे।

सबसे पहले आपको हेक्स और बिनरी के बीच तर्क देखने की आवश्यकता है।

ठीक है, एक बाइट के लिए आप 8 बिट (# 7-0) है

#7 = 0x80 = %1000 0000 
#6 = 0x40 = %0100 0000 
#5 = 0x20 = %0010 0000 
#4 = 0x10 = %0001 0000 

#3 = 0x08 = %0000 1000 
#2 = 0x04 = %0000 0100 
#1 = 0x02 = %0000 0010 
#0 = 0x01 = %0000 0001 

जब आप पढ़ा है कि द्विआधारी, एक बाइट में, यह एक% 00001000

तब की तरह बिट सेट में , से सही उर्फ ​​बिट # 3 जो 08 हेक्स का अपना महत्व होता है 4 (वास्तव में भी दशमलव, लेकिन अभी भी जब तुम हेक्स/बाइनरी यह पता लगाने दशमलव के बारे में भूल)

अब अगर हम द्विआधारी संख्या% है 10000000 यह # 7 बिट है जो चालू है। यही कारण है कि "निबल" में उन्हें योग करने के लिए 0x80

तो तुम सब करने की है की एक हेक्स मान है (हेक्स बाइट के प्रत्येक भाग के कुछ शौकीनों द्वारा एक निबल कहा जाता है)

अधिकतम आप प्राप्त कर सकते हैं एक निबल में (दशमलव) 15 या एफ है के रूप में 0x10 + 0x20 + 0x40 + 0x80 = 0xF0 = द्विआधारी% 11110000

तो एक निबल में पर (4 बिट्स) सभी रोशनी = एफ हेक्स में (15 दशमलव)

निचले निबल के लिए भी जाता है।

क्या आप पैटर्न देखते हैं?

+0

द्वारा पूर्णांक विभाजित सब कुछ की तरह है हाँ, मैं देखते हैं कि कैसे इस हिस्से काम करता है, उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद! तो अगर हमारे पास 000011001000 का मूल्य है और हम ऐसा करते हैं (8 << 1) तो यह हमें इस 000111001000 के साथ छोड़ देगा। क्या यह सही है? –

+0

तो अगर हमारे पास बाइनरी 1 और 0 की एक सरणी थी जो 32 बिट लंबी थी और हम बिट 8 को 1 से बदलना चाहते थे, तो क्या हम सिर्फ एक मान को संशोधित कर सकते थे? उदाहरण: बिन [7] = 1; ?? –

+0

आगे बढ़ना, अगर हम ऐसा करना चाहते हैं (8 << 3) क्या यह सही होगा: बिन [7] = 1; बिन [8] = 1; बिन [9] = 1; ? –

3

एक शिफ्ट के लिए @ BerggreenDK का उत्तर देखें। हेक्स में यह क्या है (समान बात, केवल अलग प्रतिनिधित्व) के बारे में कुछ जानकारी यहां दी गई है:

स्थानांतरित करना समझने के लिए एक बहुत ही सरल अवधारणा है। रजिस्टर एक निश्चित आकार का है, और जो भी बिट्स फिट नहीं होगा वह अंत तक गिर जाएगी। तो, यह उदाहरण ले:

int num = 0xffff << 16;

आपका हेक्स में चर अब 0xffff0000 होगा। ध्यान दें कि सही अंत शून्य से भरा हुआ है। अब, चलिए इसे दोबारा बदल दें।

num = num << 8; 
num = num >> 8; 

num अब 0x00ff0000 है। आपको अपनी पुरानी बिट्स वापस नहीं मिलती हैं। वही बदलावों पर भी लागू होता है।

चाल: 1 से वाम स्थानांतरण 2 से संख्या से गुणा की तरह है, और 1 से सही स्थानांतरण 2.

+0

समस्या बिटवाई ऑपरेटर में नहीं है। समस्या कक्षाओं में है और कक्षाएं पंजीकरण पते पर जानकारी कैसे निर्दिष्ट करती हैं। तो इस मामले में: रजिस्टर.SetBits ((3 << 8)); // रजिस्टर में बिट्स का उपयोग करता है ... बिट्स को कैसे असाइन किया जाएगा? रजिस्टर कैसे पता लगाता है कि कहां और किस चीज में हेरफेर करना है? अगर हम डेटाशीट से जानते हैं कि हमें थोड़ा 3 सेट 1 की आवश्यकता है, तो हम ऐसा करने के लिए सही बिटवाइज ऑपरेशन कैसे काम करते हैं? –

+0

यूआरएल लिंक: [रजिस्टर क्लास डॉक्यूमेंटेशन] (http://www.ghielectronics.com/downloads/NETMF/Library%20Documentation/html/73f12956-6a7d-d693-6db8-4ec605c50f2d.htm) दस्तावेज़ीकरण से लिंक करें। इसका संक्षिप्त और मुझे जवाब नहीं देता है। –

+0

ठीक है, एक यूरेका क्षण, मास्क में मान 1 के बिट्स रजिस्टर में सेट हैं। मास्क में मान 0 के बिट्स नहीं बदले गए हैं। इसलिए हमें पंजीकरण के लिए मूल्य निर्दिष्ट करने से पहले सेट करने के लिए बाइनरी मान को काम करने की आवश्यकता है। तो अगर हम ब्रैकेट में 0010011 (0) 11 सेट करना चाहते हैं तो हमें इस बीआईटी को सेट करने के लिए 0100 की बाइनरी पार्स करने की आवश्यकता है! अंत में वाहू! –