2010-03-31 17 views
26

उदाहरण के लिए, एनएससीएंडरडर से यह विधि बिटमैस्क लेती है:वास्तव में उन बिटकमास्क कैसे काम करते हैं?

- (NSDate *)dateByAddingComponents:(NSDateComponents *)comps toDate:(NSDate *)date options:(NSUInteger)opts 

तो विकल्प इस प्रकार हो सकते हैं:

NSUInteger options = kCFCalendarUnitYear; 

या जैसे:

NSUInteger options = kCFCalendarUnitYear | kCFCalendarUnitMonth | kCFCalendarUnitDay; 

मुझे जो नहीं मिलता है, यह वास्तव में कैसे किया जाता है? मेरा मतलब है: वे उन मानों को कैसे खींच सकते हैं जिन्हें options में विलय किया गया है? अगर मैं ऐसा कुछ प्रोग्राम करना चाहता था, तो बिटमैस्क ले सकता है, यह कैसा दिखता है?

+0

iPhone और उद्देश्य-सी की तरह टैग वास्तव में मदद जब यह जानकारी सही है कर कई भाषाओं में (और यहां तक ​​कि वाक्य रचना एक ही है)? – speedfranklin

उत्तर

32

ऐसा करने के लिए, आप बिटवाइज़ करना चाहते हैं और मूल्य आप मुखौटा के खिलाफ परीक्षण कर रहे हैं, फिर देखें कि वह Anding का परिणाम मुखौटा ही बराबर है:

if ((options & kCFCalendarUnitYear) == kCFCalendarUnitYear) { 
    // do whatever 
} 
+5

== kCFCalendarUnitYear अनावश्यक लगता है – sigjuice

+12

वास्तव में 'if (विकल्प और kCFCalendarUnitYear)' पर्याप्त होना चाहिए क्योंकि किसी भी गैर शून्य मान का अर्थ बिट को सेट किया गया है। – FRotthowe

+0

COOL आदमी, यह COOL है! – dontWatchMyProfile

36

Bitmasks वास्तव में बहुत बुनियादी रहे हैं। आप इस तरह यह सोच सकते हैं (सी # जब तक किसी को परिवर्तित कर सकते हैं):

public enum CalendarUnits 
{ 
    kCFCalendarUnitDay = 1, // 001 in binary 
    kCFCalendarUnitMonth = 2, // 010 in binary 
    kCFCalendarUnitYear = 4, // 100 in binary 
} 

फिर आप मूल्यों गठबंधन करने के लिए बिटवाइज़ ऑपरेटर्स का उपयोग कर सकते हैं:

// The following code will do the following 
// 001 or 100 = 101 
// So the value of options should be 5 
NSUInteger options = kCFCalendarUnitDay | kCFCalendarUnitYear; 

इस तकनीक को भी अक्सर सुरक्षा दिनचर्या में प्रयोग किया जाता है :

public enum Priveledges 
{ 
    User = 1, 
    SuperUser = 2, 
    Admin = 4 
} 

// SuperUsers and Admins can Modify 
// So this is set to 6 (110 binary) 
public int modifySecurityLevel = SuperUser | Admin; 

तब सुरक्षा स्तर की जांच करने के, आप बिटवाइज़ उपयोग कर सकते हैं और अगर आप पर्याप्त अनुमति है को देखने के लिए:

012,351,
public int userLevel = 1; 
public int adminLevel = 4; 

// 001 and 110 = 000 so this user doesn't have security 
if(modifySecurityLevel & userLevel == userLevel) 

// but 100 and 110 = 100 so this user does 
if(modifySecurityLevel & adminLevel == adminLevel) 
    // Allow the action 
+2

ध्यान दें कि ऑपरेटर की प्राथमिकता के कारण, 'अगर (संशोधित सुरक्षात्मकता और उपयोगकर्ता स्तर == उपयोगकर्ता स्तर) 'होना चाहिए (अगर संशोधित सुरक्षा और उपयोगकर्ता स्तर) == उपयोगकर्ता स्तर) अन्यथा अभिव्यक्ति हमेशा सत्य का मूल्यांकन करेगी। – Drahcir

+0

आप इस तरह थोड़ा स्थानांतरण भी कर सकते हैं: = 1 << 1; – Mark

6

कुंजी याद रखना है कि उन विकल्पों में से प्रत्येक जो आप "विकल्प" में विलय करते हैं, वास्तव में केवल एक संख्या है। मुझे यकीन नहीं है कि आप बाइनरी के साथ कितने परिचित हैं, लेकिन आप इसे दशमलव में सोच सकते हैं और केवल उन्हें ऑरिंग करने के बजाय संख्या जोड़ सकते हैं।

के एक = 10, बी = 100, और सी = 1000

कहते हैं कि तुम सेट करने के लिए विकल्प = ए + बी, तो विकल्प 110 के बराबर होगा विधि आप बुलाया फिर "दसियों को देखो चाहते थे तो चलो "ए के लिए जगह, बी के लिए" सैकड़ों "जगह, और सी के लिए" हजारों "स्थान। इस उदाहरण में, एक सैकड़ों स्थान और दसियों स्थान है, इसलिए विधि पता चलेगी कि ए और बी सेट किए गए थे विकल्पों में।

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

+2

अच्छी व्याख्या! धन्यवाद! – dontWatchMyProfile

+2

विचार सिर्फ समान नहीं है, लेकिन बिल्कुल वही है। केवल आधार अलग है: 2 बनाम 10. जो भी यूनिक्स/लिनक्स कमांड लाइन से परिचित है, उसने बेस -8 (ऑक्टल) में भी ऐसा किया है, इस प्रकार chmod कमांड की संख्यात्मक अनुमति मास्क काम करता है। –

16

Bitmasks 2 (अर्थात, 2 = 1, 2 = 2, 2 = 4) बिट्स के अनुक्रम में एक भी स्थान पर है की वजह से बाइनरी में काम करते हैं, प्रत्येक शक्ति।

decimal | binary 
1  | 0001 
2  | 0010 
4  | 0100 
8  | 1000 

जब आप or (ऑपरेटर सी जैसी भाषाओं में |) दो नंबर a और c में एक साथ b, आप "कह रहे हैं बिट्स कि a में हैं ले, b, या दोनों और उदाहरण के लिए: उन्हें c में डाल दें।"जब से दो की एक शक्ति एक द्विआधारी स्ट्रिंग में एक भी स्थिति का प्रतिनिधित्व करता है, वहाँ कोई ओवरलैप है, और आप तय कर सकते हैं कि कौन सा निर्धारित किया गया। उदाहरण के लिए, अगर हम or 2 और 4

0010 | 0100 = 0110 

सूचना कैसे यह मूल रूप से संयुक्त । दो दूसरी ओर, अगर हम or 5 और 3:।

decimal | binary 
5  | 0101 
3  | 0011 

0101 | 0011 = 0111 

हमें जो सूचना कह का कोई रास्ता नहीं है जो बिट्स, कहाँ से आया है क्योंकि वहाँ प्रत्येक की बाइनरी प्रतिनिधित्व के बीच ओवरलैप था

यह बीको एक और उदाहरण के साथ mes अधिक स्पष्ट। की संख्या 1, 2, और 4 (दो की सभी शक्तियों) ले

0001 | 0010 | 0100 = 0111 

यह 5 | 3 रूप में एक ही परिणाम है करते हैं! लेकिन चूंकि मूल संख्या दो की शक्तियां हैं, इसलिए हम विशिष्ट रूप से बता सकते हैं कि प्रत्येक बिट कहाँ से आया था।

+0

महान उदाहरण लेकिन मैं नहीं समझता कि आपकी आखिरी वाक्य कैसी है। हम कैसे बता सकते हैं कि 0111 0001 | 0010 | 0100 या 0101 | 0011 से आया था? – joels

+0

संपूर्ण बिंदु यह है कि हम * एक प्राथमिक * जानते हैं कि झंडे केवल दो की शक्तियां हैं। दूसरे शब्दों में, हम जानते हैं कि यह '0001 | 0010 | 0100 |' है और '0101 | 0011' नहीं है क्योंकि उत्तरार्द्ध बस एक विकल्प नहीं है, क्योंकि इसमें केवल दो शक्तियां शामिल नहीं हैं। – notJim

0

मुझे कैटलॉग.एप मिला है ताकि बिट मास्क को देखने में मदद मिल सके। (बस व्यू> प्रोग्रामर चुनें, और फिर बाइनरी दिखाने के लिए बटन पर क्लिक करें)। (आप उन बिट्स को चालू या बंद करने के लिए बाइनरी टेबल में किसी भी 0s या 1s पर क्लिक कर सकते हैं; या, दशमलव या हेक्स में संख्या दर्ज करें (विभिन्न प्रस्तुतियों के बीच स्विच करने के लिए 8 | 10 | 16 NSSegmentedControl का उपयोग करें))।

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