2010-04-30 5 views
7

मेरे पास 32 बिट लंबा चर, CurrentPosition है, जिसे मैं 4, 8 बिट वर्णों में विभाजित करना चाहता हूं। मैं सी में सबसे कुशलता से कैसे करूँगा? मैं एक 8 बिट एमसीयू, 8051 आर्किटेक्चर के साथ काम कर रहा हूं।मैं सी का उपयोग कर चार चर चर (8 बिट) में एक लंबा मूल्य (32 बिट्स) कैसे विभाजित करूं?

unsigned long CurrentPosition = 7654321; 
unsigned char CP1 = 0; 
unsigned char CP2 = 0; 
unsigned char CP3 = 0; 
unsigned char CP4 = 0; 
// What do I do next? 

मैं सिर्फ एक सूचक के साथ CurrentPosition के शुरू पते का उल्लेख होना चाहिए और फिर दो कि संबोधित चार बार जोड़ने 8?

यह थोड़ा एंडियन है।

ALSO मैं चाहता हूं कि वर्तमान स्थिति अपरिवर्तित रहे।

+2

कौन सा एंडियन? ___ – kennytm

+0

मैं लिटिल एंडियन प्रारूप – PICyourBrain

उत्तर

13
CP1 = (CurrentPosition & 0xff000000UL) >> 24; 
    CP2 = (CurrentPosition & 0x00ff0000UL) >> 16; 
    CP3 = (CurrentPosition & 0x0000ff00UL) >> 8; 
    CP4 = (CurrentPosition & 0x000000ffUL)  ; 

साथ ही आप एक सूचक के माध्यम से बाइट्स का उपयोग कर सकता है,

unsigned char *p = (unsigned char*)&CurrentPosition; 
//use p[0],p[1],p[2],p[3] to access the bytes. 
+0

1) क्या मुझे इन्हें (हस्ताक्षरित चार) के साथ डालने की ज़रूरत है? 2) क्या यह वर्तमान स्थिति को अप्रभावित छोड़ देता है? – PICyourBrain

+1

1. पूर्व को कास्टिंग करने की आवश्यकता होगी 2. दोनों विधियां वर्तमान स्थिति को अप्रभावित – Saul

+0

छोड़ दें * पूर्व को * की आवश्यकता नहीं है, लेकिन कुछ कंपाइलर सटीक होने के संभावित नुकसान के बारे में एक फर्जी चेतावनी देंगे यदि आप नहीं करते हैं। – caf

0
CP1 = (unsigned char)(CurrentPosition & 0xFF); 
CurrentPosition >>= 8; 
CP2 = (unsigned char)(CurrentPosition & 0xFF); 
... 
+0

का उपयोग करने के साथ एसडीसीसी का उपयोग कर रहा हूं यह वर्तमान स्थिति में मूल्य को सही करेगा? मैं CurrentPosition अपरिवर्तित छोड़ना चाहता हूँ। – PICyourBrain

+0

हां यह होगा, एक विकल्प है CurrentPosition की एक प्रति बनाना और प्रतिलिपि बनाना। या नोस का जवाब एक और विकल्प है। एक सूचक का उपयोग करने का आपका विचार भी संभव है।ऐसा करने के कई तरीके हैं। –

2

आप काम का एक सा है एक 8 बिट MCU एक पूरे 32 बिट चर स्थानांतरण उपयोग कर रहे हैं। इस मामले में पॉइंटर अंकगणितीय का उपयोग कर CurrentPosition के 4 बाइट पढ़ने के लिए बेहतर है। डाली:

unsigned char *p = (unsigned char*)&CurrentPosition; 

CurrentPosition परिवर्तन नहीं करता है, लेकिन अगर आप पी लिखने की कोशिश [0] आप CurrentPosition के कम से कम महत्वपूर्ण बाइट बदल जाएगा। यदि आप एक प्रतिलिपि चाहते हैं तो यह करें:

unsigned char *p = (unsigned char*)&CurrentPosition; 
unsigned char arr[4]; 
arr[0] = p[0]; 
arr[1] = p[1]; 
arr[2] = p[2]; 
arr[3] = p[3]; 

और एआर के साथ काम करें। (यदि आप चाहते हैं कि सबसे महत्वपूर्ण बाइट पहले उन असाइनमेंट में ऑर्डर बदल दें)।

आप 4 चर चाहें, तो आप स्पष्ट रूप से कर सकते हैं:

unsigned char CP1 = p[0]; 
unsigned char CP2 = p[1]; 
unsigned char CP3 = p[2]; 
unsigned char CP4 = p[3]; 
+0

यह सोलन बेहतर है यदि आप सीधे 32-बिट int को स्थानांतरित नहीं कर सकते हैं। –

5

मुझे लगता है कि आप एक संघ के उपयोग पर विचार करना चाहिए:

union { 
    unsigned long position; 
    unsigned char bytes[4]; 
} CurrentPosition; 

CurrentPosition.position = 7654321; 

बाइट्स अब पहुँचा जा सकता है के रूप में: CurrentPosition.bytes [0 ], ..., CurrentPosition.bytes [3]

+0

अभ्यास में एक अच्छा विचार क्योंकि संकलक बाइट्स में int की अपघटन कर सकता है। सिद्धांत में एक बुरा विचार क्योंकि यूनियनों का यह उपयोग सी-मानक द्वारा अपरिभाषित है .. (यदि सभी कार्यान्वयन केवल काम नहीं करेंगे) –

+0

@Nils यूनियनों के साथ दंडित करना सी 99 के बाद अच्छी तरह से परिभाषित किया गया है। हालांकि कोड अभी भी एंडियन निर्भर है। – user694733

0
unsigned char *CP = &CurrentPosition; 

अब आपके मूल कोड प्रति सीपीएनके माध्यम से पहुंचा जा सकता है।

0

मुझे पता है कि यह कुछ समय पहले पोस्ट किया गया था। लेकिन किसी के भी अभी भी धागे को पढ़ने के लिए: कई लोग अनुक्रमिक रूप से मूल मूल्य को स्थानांतरित करने का दृष्टिकोण लेते हैं। क्यों संकलक आपके लिए काम नहीं करते हैं। एक ही स्थान पर मूल्यों को स्टोर करने की अनुमति देने के लिए एक संघ & का उपयोग करें। 32 बिट लंबी चर दोनों (यह वह जगह होगी जहां आप अपनी वर्तमान स्थिति को सहेज लेंगे) और एक संरचना जिसमें 4 चार चर शामिल हैं, शामिल हैं। या बस एक साधारण 8 बिट पूर्णांक सरणी। जब आप अपनी वर्तमान स्थिति को लंबे चर पर लिखते हैं, तो जब आप 4 char चर पढ़ते हैं तो उसी स्थान पर संग्रहीत किया जाएगा। यह विधि बहुत कम श्रम गहन है और संकलक को & संसाधनों को बर्बाद करने की बजाय काम करने की अनुमति नहीं देती है।

+1

यह वही है जो [दूसरा सबसे ऊपर उत्तर दिया गया जवाब] (https://stackoverflow.com/a/2747324/2564301) सुझाता है। – usr2564301

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