2008-10-28 19 views
54

हे! मैं http://www.gnu.org/software/m68hc11/examples/primes_8c-source.htmlहेक्स का उपयोग क्यों करें?

में इस कोड को देख रहा था मैंने देखा है कि कुछ स्थितियों में वे लाइन 134 में हेक्स संख्याओं का उपयोग किया है, जैसे:

for (j = 1; val && j <= 0x80; j <<= 1, q++) 

अब क्यों वे 0x80 का प्रयोग करेंगे? मैं हेक्स के साथ अच्छा नहीं हूं लेकिन मुझे दशमलव में ऑनलाइन हेक्स मिला और उसने मुझे 0x80 के लिए 128 दिया।

small_n = (n & 0xffff0000) == 0; 

दशमलव के हेक्स मुझे उस हेक्स संख्या के लिए ४२९४९०१७६० दिया:

इसके अलावा लाइन 134 से पहले, लाइन 114 पर वे इस किया है। तो इस लाइन में वे थोड़ा सा बना रहे हैं और परिणाम की तुलना 0 से कर रहे हैं ??

क्यों न केवल संख्या का उपयोग करें? क्या कोई भी कृपया समझा सकता है और कृपया अन्य स्थितियों के उदाहरण दें।

कोड के अलावा मैंने देखा है बड़ी लाइनों जहां यह सिर्फ हेक्स संख्या है और वास्तव में कभी नहीं समझ में आ क्यों :(

उत्तर

103

दोनों ही मामलों आप का हवाला देते में, संख्या के बिट पैटर्न महत्वपूर्ण, न कि वास्तविक संख्या है।

उदाहरण के लिए

, पहले मामले में, j 1, तो 2, 4, 8, 16, 32, 64 और अंत में होने के लिए 128 के रूप में पाश की प्रगति जा रहा है।

द्विआधारी में, जो है,

0000:0001, 0000:0010, 0000:0100, , 0001:0000, 0010:0000, 0100:0000 और 1000:0000

सी या सी ++ में द्विआधारी स्थिरांक के लिए कोई विकल्प नहीं है, लेकिन यह थोड़ा हेक्स में स्पष्ट है: 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, और 0x80

दूसरे उदाहरण में, लक्ष्य मूल्य के निचले दो बाइट को निकालना था। तो 1,234,567,8 9 0 का मूल्य दिया गया है, हम 1,234,567,168 के साथ समाप्त करना चाहते हैं।
हेक्स में, यह स्पष्ट है: 0x4996:02d2 के साथ शुरू करें, 0x4996:0000 के साथ समाप्त करें।

+2

दूसरे उदाहरण पर मामूली सुधार: यह चार-बाइट संख्या के निचले दो बाइट को हटा देता है। निचले चार बाइट को हटाने से बस "small_n = 0;" होगा। –

+3

डी ओह! हां, मैं "4 अंक" और "दो बाइट्स" लिखने के बीच बहस कर रहा था, इसलिए स्वाभाविक रूप से मैंने उन्हें गलत कथन में उलझा दिया ..... –

17

यह थोड़ा सा मुखौटा है। हेक्स मान अंतर्निहित द्विआधारी प्रतिनिधित्व को देखना आसान बनाता है। एन & 0xffff0000 एन के शीर्ष 16 बिट्स देता है। 0xffff0000 का मतलब है "बाइनरी में 16 1 एस और 16 0 एस"

0x80 का अर्थ है "1000000", इसलिए आप "00000001" से शुरू करते हैं और बाईं ओर "0000010", 000000 "," 1000000 "तक उस बिट को स्थानांतरित करना जारी रखते हैं

3

हेक्स, या हेक्साडेसिमल, संख्या 4 बिट्स डेटा, 0 से 15 या एचएक्स 0 में एफ का प्रतिनिधित्व करते हैं। दो हेक्स मान बाइट का प्रतिनिधित्व करते हैं।

16

0xffff0000 यह समझना आसान है कि यह 32 बिट मान में 16 गुणा "1" और 16 गुणा "0" है, जबकि 42 9 4 9 01760 जादू है।

6

कभी-कभी हेक्स में मानों का दृश्य प्रतिनिधित्व कोड को और अधिक पठनीय या समझा जा सकता है। उदाहरण के लिए बिटमैस्किंग या बिट्स का उपयोग संख्याओं के दशमलव प्रतिनिधित्व को देखते समय गैर-स्पष्ट हो जाता है।

यह कभी कभी स्थान की मात्रा एक विशेष मान प्रकार प्रस्ताव दिया है के साथ कर सकते हैं, ताकि यह भी एक भूमिका निभा सकते हैं।

एक विशिष्ट उदाहरण तो बजाय दशमलव का उपयोग कर कुछ मान को दिखाने के लिए की एक द्विआधारी की स्थापना में हो सकता है,, हम द्विआधारी का उपयोग करें। एक तरह से प्रतिनिधित्व करने के लिए उन गुणों के राज्य 3 बिट्स के साथ है -

मान लीजिए कि एक वस्तु के गुण है कि चालू या बंद (3 उनमें से) के मूल्यों था की एक गैर अनन्य सेट था करते हैं।

मान्य प्रतिनिधित्व दशमलव में 0 से 7 हैं, लेकिन यह इतना स्पष्ट नहीं है। और अधिक स्पष्ट द्विआधारी प्रतिनिधित्व है:

000, 001, 010, 011, 100, 101, 110, 111

इसके अलावा, कुछ लोगों को अभी हेक्स साथ बहुत आराम कर रहे हैं। यह भी ध्यान दें कि हार्ड-कोडेड जादू संख्या है कि बस रहे हैं और यह सब नहीं है कि महत्वपूर्ण कोई फर्क नहीं पड़ता नंबर

उपयोग करने के लिए मुझे आशा है कि मदद करता है प्रणाली है।

1

फ़ाइल को देखते हुए, यह कुछ सुंदर गौण कोड है। आशा है कि आप एक ट्यूटोरियल के रूप में उपयोग सेल्सियस पर और न ही अच्छे हैं ... जब आप सीधे बिट स्तर पर या सिर्फ यह ऊपर काम कर रहे हैं

हेक्स उपयोगी है। उदाहरण के लिए, एक ड्राइवर पर काम करना जहां आप किसी डिवाइस से आने वाली बिट्स पर सीधे देख रहे हैं और परिणामों को घुमा रहे हैं ताकि कोई और सुसंगत परिणाम पढ़ सके। यह बाइनरी का एक कॉम्पैक्ट काफी आसान-पढ़ने वाला प्रतिनिधित्व है।

+1

उस कोड के साथ कुछ भी गलत नहीं है। उस कोड को देखते हुए, मुझे हेक्स का उपयोग किये बिना इसे लिखने का एक और स्पष्ट तरीका नहीं मिला। – Kibbee

17

अंक और अंतर्निहित बिट पैटर्न (उस बात के लिए या अष्टाधारी) हेक्स के बीच एक सीधा मानचित्रण, जो दशमलव के साथ ऐसा नहीं है नहीं है। एक दशमलव '9' बिट पैटर्न के संबंध में कुछ अलग प्रतिनिधित्व करता है, इस पर निर्भर करता है कि यह किस कॉलम में है और इसमें कितनी संख्याएं हैं - इसका थोड़ा सा पैटर्न नहीं है। हेक्स में, '9' का अर्थ हमेशा '1001' होता है, इससे कोई फर्क नहीं पड़ता कि कौन सा कॉलम। 9 = '1001', 95 = '* 1001 * 0101' और बहुत आगे।

मेरे 8-बिट दिनों के निजता के रूप में मुझे हेक्स बाइनरी के लिए सुविधाजनक शॉर्टेंड मिलता है। बिट twiddling एक मरने कौशल है। एक बार (लगभग 10 साल पहले) मैंने विश्वविद्यालय में तीसरे वर्ष नेटवर्किंग पेपर को देखा जहां कक्षा में लोगों के केवल 10% (50 में से 5 या उससे अधिक) बिट-मास्क की गणना कर सकते थे।

6

आम तौर पर दशमलव के बजाय हेक्स संख्याओं का उपयोग यह इसलिए होता है क्योंकि कंप्यूटर बिट्स (बाइनरी नंबर) के साथ काम करता है और जब आप बिट्स के साथ काम कर रहे होते हैं तो हेक्साडेसिमल संख्याओं का उपयोग करने के लिए भी अधिक समझ में आता है, क्योंकि हेक्स से द्विआधारी तक आसानी से जा रहा है दशमलव से बाइनरी तक।

OxFF = 1111 1111 (F = 1111) 

लेकिन

255 = 1111 1111 

क्योंकि

255/2 = 127 (rest 1) 
127/2 = 63 (rest 1) 
63/2 = 31 (rest 1) 
... etc 

आपको लगता है कि देख सकते हैं? हेक्स से बाइनरी में जाने के लिए यह बहुत आसान है।

10

मुझे यह गड़बड़ है कि भाषाओं के सी परिवार ने हमेशा ऑक्टल और हेक्स का समर्थन किया है लेकिन बाइनरी नहीं है।मैं लंबे समय से है कि वे द्विआधारी के लिए प्रत्यक्ष समर्थन जोड़ना होगा कामना की है

int mask = 0b00001111; 

कई साल/नौकरियों पहले, जबकि एक परियोजना है कि थोड़ा-स्तरीय गणित का एक विशाल राशि शामिल पर काम कर रहा, मैं तंग आ गया हो गया और एक हैडर उत्पन्न फ़ाइल है कि 8 बिट करने के लिए सभी संभव द्विआधारी मूल्यों के लिए परिभाषित स्थिरांक का समावेश है:

#define b0  (0x00) 
#define b1  (0x01) 
#define b00  (0x00) 
#define b01  (0x01) 
#define b10  (0x02) 
#define b11  (0x03) 
#define b000  (0x00) 
#define b001  (0x01) 
... 
#define b11111110 (0xFE) 
#define b11111111 (0xFF) 

यह कभी-कभी कुछ बिट स्तर कोड अधिक पठनीय बना दिया है।

+3

पुन: "मैं लंबे समय है कि वे द्विआधारी के लिए प्रत्यक्ष समर्थन जोड़ना होगा कामना की है" - कुछ compilers एक विस्तार के रूप में यह लागू है: मैं विभिन्न पीआईसी सी compilers में यह देखा है, आम तौर पर की तरह "0b10110110" –

+1

@Andrew मेडिको कुछ आप मिल गया आपके द्वारा उल्लिखित रूप में सी ++ 14 के साथ आपकी इच्छा। –

6

हेक्स का सबसे बड़ा उपयोग शायद एम्बेडेड प्रोग्रामिंग में है। हेक्स संख्याओं का उपयोग हार्डवेयर रजिस्टरों में अलग-अलग बिट्स को मास्क करने के लिए किया जाता है, या एकल 8, 16, या 32-बिट रजिस्टर में पैक किए गए कई संख्यात्मक मानों को विभाजित किया जाता है।

जब अलग-अलग सा मास्क निर्दिष्ट करते समय, बहुत से लोगों को बाहर से शुरू:

#define bit_0 1 
#define bit_1 2 
#define bit_2 4 
#define bit_3 8 
#define bit_4 16 
etc... 

थोड़ी देर के बाद, वे अग्रिम करने के लिए:

#define bit_0 0x01 
#define bit_1 0x02 
#define bit_2 0x04 
#define bit_3 0x08 
#define bit_4 0x10 
etc... 

तब वे धोखा देने के लिए जानने के लिए, और संकलक जाने संकलन समय अनुकूलन के हिस्से के रूप में मूल्य उत्पन्न करें:

#define bit_0 (1<<0) 
#define bit_1 (1<<1) 
#define bit_2 (1<<2) 
#define bit_3 (1<<3) 
#define bit_4 (1<<4) 
etc... 
3

अधिक सटीक, हेक्स और दशमलव, ar ई सभी NUMBER एस। रेडिक्स (बेस 10, 16, इत्यादि) उन संख्याओं को ऐसे तरीके से पेश करने के तरीके हैं जो या तो स्पष्ट, या अधिक सुविधाजनक हैं।

"कुछ में से कितने हैं" पर चर्चा करते समय हम आम तौर पर दशमलव का उपयोग करते हैं। जब हम कंप्यूटर पर पते या बिट पैटर्न देख रहे हैं, हेक्स आमतौर पर पसंद किया जाता है, क्योंकि अक्सर व्यक्तिगत बाइट्स का अर्थ महत्वपूर्ण हो सकता है।

हेक्स, (और ऑक्टल) में संपत्ति है कि वे दो की शक्तियां हैं, इसलिए वे समूह की अच्छी तरह से मानचित्रण करते हैं। हेक्स नक्शा 4 बिट्स एक हेक्स निबल (0-एफ) तक, इसलिए एक बाइट दो निबल्स (00-एफएफ) में संग्रहीत किया जाता है। ऑक्टल डिजिटल उपकरण (डीईसी) और अन्य पुरानी मशीनों पर लोकप्रिय था, लेकिन एक ऑक्टल अंकों के नक्शे तीन बिट्स पर थे, इसलिए यह बाइट सीमाओं को अच्छी तरह से पार नहीं करता है।

कुल मिलाकर, रेडिक्स की पसंद आपके प्रोग्रामिंग को आसान बनाने का एक तरीका है - डोमेन का सर्वोत्तम मिलान करने वाले व्यक्ति का उपयोग करें।

3

बाइट में 8 बिट्स हैं। हेक्स, आधार 16, terse है। किसी भी संभावित बाइट मान संग्रह 0..9, प्लस ए, बी, सी, डी, ई, एफ से दो अक्षरों का उपयोग करके व्यक्त किया जाता है।

बेस 256 अधिक terse होगा। प्रत्येक संभावित बाइट का अपना एकल चरित्र हो सकता है, लेकिन अधिकांश मानव भाषाएं 256 वर्णों का उपयोग नहीं करती हैं, इसलिए हेक्स विजेता है।

टेर्स होने के महत्व को समझने के लिए, 1 9 70 के दशक में जब आप अपनी मेगाबाइट मेमोरी की जांच करना चाहते थे, तो इसे हेक्स में मुद्रित किया गया था। प्रिंटआउट बड़े पेपर के कई हज़ार पृष्ठों का उपयोग करेगा। ओक्टल ने और भी पेड़ बर्बाद कर दिया होगा।

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