2010-06-04 16 views
6

मैं ढांचा निर्देशिका में NSArray.h हेडर फाइल में इस देखा:"एनएसबीनरी सर्चिंग फर्स्ट एक्वाल = (1UL << 8)" का अर्थ गणना गणना में क्या है?

enum { 
    NSBinarySearchingFirstEqual = (1UL << 8), 
    NSBinarySearchingLastEqual = (1UL << 9), 
    NSBinarySearchingInsertionIndex = (1UL << 10), 
}; 
typedef NSUInteger NSBinarySearchingOptions; 

क्या "NSBinarySearchingFirstEqual = (1UL < < 8)" की बात है और क्या यह गणना और "NSBinarySearchingOptions" के बीच संबंध है? टाइप परिभाषा? धन्यवाद।

उत्तर

9

"NSBinarySearchingFirstEqual = (1UL < < 8)" आदि गणना स्थिरांक को विशिष्ट मान निर्दिष्ट करते हैं। मूल्यों को चुना जाता है ताकि उन्हें एक बिट द्वारा दर्शाया जा सके, जिससे विकल्पों को बिटवाई ऑपरेशंस के साथ जोड़ा जा सके। "< <" ऑपरेटर बाएं शिफ्ट है; आप समतुल्य रूप लिख सकते हैं:

enum { 
    NSBinarySearchingFirstEqual = 256, 
    NSBinarySearchingLastEqual = 512, 
    NSBinarySearchingInsertionIndex = 1024, 
}; 

विकल्प की तरह जोड़ा जा सकता है:

NSBinarySearchingOptions opt = NSBinarySearchingFirstEqual | NSBinarySearchingLastEqual; 

ध्यान दें कि NSBinarySearchingOptions, एक अहस्ताक्षरित पूर्णांक, नहीं enum को typedef'd जाता है क्योंकि यह मान रहे हैं कि शामिल कर सकते हैं परिभाषित enum मानों में से एक नहीं (जब एकाधिक मान संयुक्त होते हैं)।

+0

"यदि आप एनएसबीनरी सर्चिंग फर्स्ट एक्वाल और एनएसबीनरी सर्चिंगलास्ट एक्वाल दोनों निर्दिष्ट करते हैं, तो एसडीके दस्तावेज़ से एक एनएसआईएनवालिडअर्ग्यूमेंट अपवाद" फेंकता है। –

5

आमतौर पर enum परिभाषा यह इंगित करता है कि यह bit mask है। गणना के प्रत्येक सदस्य के पास एक अद्वितीय मूल्य होता है लेकिन इसका अर्थ केवल एक बिट सेट होता है, जिसका अर्थ है कि जब आप कई मानों को जोड़ते हैं, तो आप अभी भी यह निर्धारित करने में सक्षम हैं कि कौन से बिट सेट किए गए हैं।

उदाहरण के लिए, इस 32-बिट पूर्णांक बाइनरी में प्रतिनिधित्व मान:

0000 0000 0000 0000 0000 0001 0000 0000 

8 बिट सेट कर दिया जाता है, जो enum मूल्य NSBinarySearchingFirstEqual से मेल खाती है, के बाद से मूल्य 1 8 बिट स्थानांतरित कर दिया करने के लिए छोड़ दिया समाप्त होता है 8 बिट जा रहा है (यह मानते हुए आप 0 से अपने बिट्स आदेश)

0000 0000 0000 0000 0000 0101 0000 0000 

यह पिछले 32-बिट पूर्णांक 2 बिट्स सेट कर रहे हैं कि, 8 वीं और 10 वीं है। ये दो बिट्स NSBinarySearchingFirstEqual और NSBinarySearchingInsertionIndex से मेल खाते हैं।

यदि आप बिट स्थानांतरण से अपरिचित हैं, तो Wikipedia article पर एक नज़र डालें, जिसमें कुछ उपयोगी आरेख हैं।

टाइप परिभाषा का अर्थ है कि NSBinarySearchingOptionNSUInteger प्रकार का है। अनिवार्य रूप से वे एक ही बात हैं, लेकिन एक अलग प्रकार को परिभाषित करके यह स्पष्ट हो जाता है कि इस प्रकार के तर्क के लिए किस प्रकार के मूल्य प्रदान किए जाते हैं।

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