2009-06-24 14 views
63

endianness बिटवाई ऑपरेशंस के साथ बिल्कुल भी मायने रखता है? या तो logical या स्थानांतरण?बिटवाई ऑपरेटरों और "endianness"

मैं bitwise ऑपरेटरों के संबंध में होमवर्क पर काम कर रहा हूं, और मैं उस पर सिर या पूंछ नहीं बना सकता, और मुझे लगता है कि मैं अंतहीनता पर काफी लटका रहा हूं। यही है, मैं एक छोटी एंडियन मशीन (जैसे अधिकांश हैं) का उपयोग कर रहा हूं, लेकिन क्या इसे विचार करने की आवश्यकता है या यह एक बर्बाद तथ्य है?

मामले में यह मायने रखती है, मैं सी

+0

डुप्लिकेट: http://stackoverflow.com/questions/7184789/does-bit-shift-depends-on-endianness – 0andriy

उत्तर

65

एंडियननेस केवल स्मृति में डेटा के लेआउट के लिए महत्वपूर्ण है। जैसे ही प्रोसेसर द्वारा डेटा को लोड किया जाता है, अंतहीनता पूरी तरह से अपरिवर्तनीय है। शिफ्ट, बिटवाई ऑपरेशंस, और ऐसा करने पर आप अपेक्षा करते हैं (डेटा को तर्कसंगत रूप से उच्च-आदेश बिट के रूप में रखा जाता है) अंतहीनता के बावजूद।

+19

यह तर्कसंगत रूप से "कम आदेश बिट के लिए उच्च" नहीं होना चाहिए? – legends2k

+1

@ किंवदंतियों 2k: एक ही विचार था –

+0

@ legends2k: हाँ। बाएं शिफ्ट = 2 की शक्ति से गुणा करें। दायां शिफ्ट = 2 की शक्ति से विभाजित करें (ऋणात्मक मूल्यों के लिए पूर्णांक विभाजन से अलग गोल करने के साथ)। –

1

भाषा का उपयोग कर रहा हूँ आप निर्दिष्ट नहीं किया है लेकिन आम तौर पर, इस तरह के सी सार बिटवाइज़ संचालन में दूर endianness जैसी भाषाओं प्रोग्रामिंग। तो नहीं, यह bitwise संचालन में कोई फर्क नहीं पड़ता।

+1

यह देखते हुए कि प्रश्न में कोई संशोधन नहीं है, मुझे आश्चर्य है कि आपने कहा है कि उन्होंने भाषा का उल्लेख नहीं किया है, जब वह करता है, और इसे सी –

+2

@ सिमॉन के रूप में भी टैग किया गया है: उस समय मैंने यह जवाब नहीं लिखा था। एक छोटे से समय फ्रेम में एक लेखक द्वारा संपादन एक में विलय किया जाएगा। यही कारण है कि आप इसे एक संशोधन के रूप में देख रहे हैं। –

60

बिटवाई ऑपरेटर अंतहीनता को दूर करते हैं। उदाहरण के लिए, >> ऑपरेटर हमेशा बिट्स को कम से कम महत्वपूर्ण अंक की ओर ले जाता है। हालांकि, इसका मतलब यह नहीं है कि आप उनका उपयोग करते समय अंतहीनता को पूरी तरह से अनदेखा कर सकते हैं, उदाहरण के लिए जब एक बड़ी संरचना में व्यक्तिगत बाइट्स से निपटने पर आप हमेशा यह नहीं मान सकते कि वे एक ही स्थान पर गिर जाएंगे।

short temp = 0x1234; 
temp = temp >> 8; 

// on little endian, c will be 0x12, on big endian, it will be 0x0 
char c=((char*)&temp)[0]; 

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

+1

आप मूल रूप से सभी के साथ असहमत हैं लेकिन फिर भी आपका उत्तर सबसे अच्छा वोट दिया गया था। व्यवहार की पहचान कैसे कर सकते हैं? –

+0

मैंने कुछ और स्पष्टीकरण –

+1

जोड़ा है, इसलिए आगे स्पष्ट करने के लिए आपका मतलब है कि अगर मैं वास्तव में बाइट्स में मानों को पुनर्प्राप्त नहीं कर रहा हूं तो यह ठीक है? –

4

जैसा कि अन्य ने उल्लेख किया है, बदलावों को सी भाषा विनिर्देश द्वारा परिभाषित किया गया है और अंतहीनता से स्वतंत्र हैं, लेकिन यदि आर्किटेक्चर किसी के पूरक या दो पूरक पूरक अंक का उपयोग करता है तो सही शिफ्ट का कार्यान्वयन अलग-अलग हो सकता है।

1

यह निर्भर करता है। संख्या को नए प्रकार में कास्ट किए बिना, आप अंतहीनता को पारदर्शी रूप से इलाज कर सकते हैं।

हालांकि, अगर आपके ऑपरेशन में कुछ नए प्रकार का कास्टिंग शामिल है, तो अपनी सावधानी बरतें।

उदाहरण के लिए, यदि आप सही तरीके से कुछ बिट्स और कास्ट (स्पष्ट रूप से या नहीं) को एक नए प्रकार में बदलना चाहते हैं, तो अंतहीनता मायने रखती है!

अपने endianness परीक्षण करने के लिए, आप बस एक char में एक int डाली कर सकते हैं:

int i = 1; 

char *ptr; 

... 

ptr = (char *) &i; //Cast it here 

return (*ptr); 
+0

... या संघ बनाओ ... '{union {int i = 1; चार ए [4];} बी; वापसी बी.ए [3] == 1;} // बड़ा एंडियन ' –

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