objective c Bitwise और ऑपरेटर को समझना




objective-c operators (4)

मैं कोचन की पुस्तक "ऑब्जेक्टिव-सी में प्रोग्रामिंग" में उद्देश्य-सी में बिट ऑपरेटर के बारे में पढ़ रहा हूं।

मैं इस भाग के बारे में बहुत उलझन में हूं, हालांकि मुझे अब तक जो कुछ भी प्रस्तुत किया गया है, उसे मैंने वास्तव में समझा है।

पुस्तक से उद्धरण यहां दिया गया है:

बिटवाई और ऑपरेटर

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

w3 = w1 & 3;

W3 bitwise के मान को w3 को स्थिर 3 के साथ निर्दिष्ट करता है। इसमें डब्ल्यू में सभी बिट्स को सेट करने का वही प्रभाव होता है, जो कि लगभग दो बिट्स 0 के अलावा और w1 से दाएं दो बिट्स को संरक्षित करता है।

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

word &= 15;

इसलिए निम्न कार्य को निम्न कार्य करता है:

word = word & 15;

इसके अतिरिक्त, इसका मतलब है कि शब्द के दाएं चार बिट्स को 0 पर सेट करने का प्रभाव है। बिटटाइज ऑपरेशंस करने में स्थिरांक का उपयोग करते समय, आमतौर पर ओक्टल या हेक्साडेसिमल नोटेशन में स्थिरांक को व्यक्त करना अधिक सुविधाजनक होता है।

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

जब पुस्तक "सभी बिट्स को सेट करने" का संदर्भ देती है, तो सभी बिट्स .. वास्तव में थोड़ा सा क्या है। क्या यह दूसरे आधार पर सिर्फ 0 या 1 नहीं है, दूसरे शब्दों में, बाइनरी?

यदि हां, तो क्यों, पहले उदाहरण में, "सही 2" से 0 को छोड़कर सभी बिट्स हैं? क्या यह 2 है क्योंकि यह 3 - 1 है, जो हमारे निरंतर से 3 ले रहा है?

धन्यवाद!


"बिट" "द्विआधारी अंक" के लिए छोटा है। और हाँ, यह 0 या 1 है। बाइट में लगभग हमेशा 8 होते हैं, और वे लिखते हैं जैसे कि दशमलव संख्याएं हैं - बाईं ओर सबसे महत्वपूर्ण अंक के साथ, और दाईं ओर कम से कम महत्वपूर्ण।

आपके उदाहरण में, w1 & 3 मास्क सबकुछ लेकिन कम से कम महत्वपूर्ण (दाएं) अंक हैं क्योंकि 3, बाइनरी में 00000011 है। (2 + 1) और ऑपरेशन 0 देता है यदि थोड़ा सा एंडेड 0 है, तो आखिरी सब कुछ दो बिट स्वचालित रूप से 0 हैं।


@cHao और सब: नहीं! बिट्स संख्या नहीं हैं। वे शून्य या एक नहीं हैं!

खैर, 0 और 1 संभव और वैध व्याख्याएं हैं। शून्य और एक सामान्य व्याख्या है।

लेकिन थोड़ा सा केवल एक चीज है, जो एक साधारण विकल्प का प्रतिनिधित्व करती है। यह कहता है "यह है" या "यह नहीं है"। यह चीज़, "इसे", स्वयं के बारे में कुछ भी नहीं कहता है। यह नहीं बताता, यह क्या बात है।

ज्यादातर मामलों में यह आपको परेशान नहीं करेगा। आप उन्हें संख्याओं (या संख्याओं के अंक, अंकों, संख्याओं) के रूप में ले सकते हैं (या प्रोग्रामिंग भाषाओं, सीपीयू और अन्य हार्डवेयर का संयोजन, जिसे आप "ठेठ" के रूप में जानते हैं) usaly do - और शायद आपको कभी भी परेशानी नहीं होगी उन्हें।

लेकिन अगर आप "0" और "1" के अर्थ को स्विच करते हैं तो कोई मूल समस्या नहीं है। ठीक है, प्रोग्रामिंग असेंबलर के दौरान ऐसा करने पर, आपको थोड़ा समस्याग्रस्त लगेगा क्योंकि कुछ निमोनिक्स अन्य तर्क करेंगे, फिर वे आपको उनके नाम बताएंगे, संख्याओं को अस्वीकार कर दिया जाएगा और ऐसी चीजें।

यदि आप चाहें तो http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm पर एक नज़र डालें।

अस्सलाम वालेकुम


w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

0 और कुछ भी एन = 0

1 और किसी भी बिट एन = एन

तो, पिछले तीन सेट को छोड़कर 0 के साथ कुछ भी bitwise और 3 के साथ अपने सभी बिट्स है। इस मामले में पिछले दो बिट्स, ए और बी संरक्षित हैं।


संख्या इस तरह बाइनरी में व्यक्त की जा सकती है:

3    = 000011
5    = 000101
10   = 001010

...आदि। मुझे लगता है कि आप बाइनरी से परिचित हैं।

बिटवाई और दो नंबर लेने का मतलब है, उन्हें एक दूसरे के ऊपर लाइन करें, और एक नया नंबर बनाएं जिसमें 1 है जहां दोनों नंबरों में 1 है (बाकी सब कुछ 0 है)।

उदाहरण के लिए:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

बिटवाई या दो नंबर लेने का मतलब है, उन्हें एक दूसरे के ऊपर लाइन करें, और एक नया नंबर बनाएं जिसमें 1 है जहां या तो नंबर 1 है (बाकी सब कुछ 0 है)।

उदाहरण के लिए:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

बिटवाई एक्सओआर (अनन्य ओआर) का अर्थ है दो नंबर लेना, उन्हें एक-दूसरे के ऊपर ले जाना, और एक नया नंबर बनाना जिसमें 1 है या तो नंबर 1 है और दूसरे नंबर में 0 है (बाकी सब कुछ 0 है)।

उदाहरण के लिए:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

बिटवाईयर एनओआर (नहीं या) का मतलब बिटवाइ या दो नंबरों को लेना है, और उसके बाद सबकुछ उलट देता है (जहां 0 था, वहां अब 1 था, जहां 1 था, अब 0 है)।

बिटवाइंड NAND (नहीं और) का मतलब है बिटटाइज और दो नंबरों को लेना, और उसके बाद सबकुछ रिवर्स (जहां 0 था, वहां अब 1 है, जहां 1 था, अब 0 है)।

निरंतर: word &= 15 सभी 4 बिट्स बिट्स को 0 पर क्यों सेट करते हैं? अब आप इसे समझने में सक्षम होना चाहिए ...

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

( 0 AND a = 0 , 0 AND b = 0 , ... j AND 1 = j , i AND 1 = i , ...)

यह कैसे उपयोगी है? कई भाषाओं में, हम "बिटमैस्क" नामक चीजों का उपयोग करते हैं। एक बिटमास्क अनिवार्य रूप से एक संख्या है जो एक साथ संयुक्त संख्याओं के पूरे समूह का प्रतिनिधित्व करता है। हम संख्याओं को एक साथ जोड़कर जोड़ सकते हैं, और उन्हें और अलग करके खींच सकते हैं। उदाहरण के लिए:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

अगर मेरे पास केवल नक्शा और टोपी है, तो मैं इसे myInventoryBitmask = (MagicMap | MagicHat) रूप में व्यक्त कर सकता हूं और नतीजा मेरा बिटकमास्क है। अगर मेरे पास कुछ भी नहीं है, तो मेरा बिटकमास्क 0 है। अगर मैं देखना चाहता हूं कि मेरे पास मेरी छड़ी है, तो मैं कर सकता हूं:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wand\n");
} else {
  printf("I don't have a wand\n");
}

उसे ले लो?

संपादित करें: अधिक सामान

आप "बिट्सफ़्ट" ऑपरेटर में भी आ जाएंगे: << और >>। इसका मतलब यह है कि "सबकुछ बाएं एन बिट्स को छोड़ दें" या "सबकुछ सही एन बिट्स को बदलें"।

दूसरे शब्दों में:

1 << 3 = 0001 << 3 = 0001000 = 8

तथा:

8 >> 2 = 01000 >> 2 = 010 = 2





bitwise-operators