एक गोल-गोल प्रोग्रामर को बिट-वार ऑपरेशन के साथ कितना अच्छा होना चाहिए? [बन्द है]


34

मैं हाल ही में कुछ OpenJDK कोड ब्राउज़ कर रहा हूं और वहां कोड के कुछ पेचीदा टुकड़े मिल गए हैं जो कि बिट-वार ऑपरेशन के साथ करना है । मैंने StackOverflow पर भी इसके बारे में एक सवाल पूछा ।

एक और उदाहरण जो बिंदु को दर्शाता है:

 1141       public static int bitCount(int i) {
 1142           // HD, Figure 5-2
 1143           i = i - ((i >>> 1) & 0x55555555);
 1144           i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
 1145           i = (i + (i >>> 4)) & 0x0f0f0f0f;
 1146           i = i + (i >>> 8);
 1147           i = i + (i >>> 16);
 1148           return i & 0x3f;
 1149       }

यह कोड इंटेगर क्लास में पाया जा सकता है ।

मैं मदद नहीं कर सकता, लेकिन जब मैं इसे देखता हूं तो बेवकूफ महसूस करता हूं। क्या मुझे कॉलेज में एक कक्षा या दो याद आती है या यह कुछ ऐसा नहीं है जिसे मैं बस प्राप्त करने वाला हूं ? मैं साधारण बिट-वार ऑपरेशन (जैसे कि एंडिंग, ओरिंग, XORing, शिफ्टिंग) कर सकता हूं, लेकिन चलो, कोई कैसे इस तरह के कोड के साथ आता है?

एक अच्छी तरह से गोल प्रोग्रामर को बिट-वार ऑपरेशन के साथ कितना अच्छा होना चाहिए?

एक तरफ ध्यान दें ... मुझे क्या चिंता है कि स्टैकऑवरफ्लो पर मेरे सवाल का जवाब देने वाले व्यक्ति ने कुछ ही मिनटों में इसका जवाब दिया। अगर वह ऐसा कर सकता है, तो मैं हेडलाइट्स में हिरण की तरह क्यों घूरता था?


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

26
अगर मैं किसी को यूजर इंटरफेस डेवलपमेंट या वेब डेवलपमेंट करने के लिए हायर कर रहा हूं, तो बिट मैनिपुलेशन कुछ ऐसा नहीं है जिसके बारे में मैं पूछूंगा क्योंकि, चांस हैं, वे इसे कभी नहीं देखेंगे। हालाँकि, मुझे उम्मीद है कि नेटवर्क प्रोटोकॉल, एम्बेडेड सिस्टम और डिवाइस ड्राइवर के साथ काम करने वाला कोई व्यक्ति इससे परिचित होगा।
थॉमस ओवेन्स

11
>>>एक ऑपरेटर के रूप में पृथ्वी पर क्या है ?
डेडएमजेड

10
@ डेडएमजी: अहस्ताक्षरित सही बदलाव। download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
c_maker

3
// HD, Figure 5-2पहली चीज होगी जो मैंने देखी होगी। फ़ाइल की शुरुआत में टिप्पणियों के अनुसार, HDहै Henry S. Warren, Jr.'s Hacker's Delight
श्नाडर

जवाबों:


38

मैं कहूंगा कि एक अच्छी तरह से गोल डेवलपर के रूप में, आपको ऑपरेटरों और बिटवाइज़ संचालन को समझने की आवश्यकता है ।

इसलिए, कम से कम, आपको थोड़ा सोचने के बाद ऊपर दिए गए कोड का पता लगाने में सक्षम होना चाहिए।

बिटवाइज़ ऑपरेशन कम स्तर के होते हैं, इसलिए यदि आप वेबसाइटों और LOB सॉफ़्टवेयर पर काम करते हैं, तो आप उनका उपयोग करने की संभावना नहीं रखते हैं।

अन्य चीजों की तरह, यदि आप उनका ज्यादा इस्तेमाल नहीं करते हैं, तो आप उनमें संवादी नहीं होंगे।

इसलिए, आपको इस बारे में चिंता नहीं करनी चाहिए कि यह बहुत जल्दी पता लगाने में सक्षम है, क्योंकि वे (शायद) इस तरह के कोड के साथ बहुत काम करते हैं। संभवतः OS कोड, ड्राइवर कोड या अन्य मुश्किल सा हेरफेर लेखन।


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

आपको यह भी समझना चाहिए कि आप उनका उपयोग कब करेंगे और यदि उनके हाथ में समस्या का सही समाधान है तो उनके उपयोग से दूर न हों।
14:60 पर user606723

@ User606723 की टिप्पणी में जोड़ने के लिए - वहाँ वास्तव में है, लेकिन कुछ स्थानों पर जहां बिटवाइज़ सामान आमतौर पर उपयोग किया जाता है और जो कम या ज्यादा आम तौर पर सामना किया जाता है - हैशिंग (और इससे संबंधित सामान) और आरजीबी के विशेष रंगों को निकालने / स्थापित करने पर यदि वे एक में 'संग्रहीत रहे int। उदाहरण के लिए, सीपीयू की जानकारी एक विशिष्ट रजिस्टर से लौटे बिट झंडे की जांच करके पढ़ी जा सकती है, लेकिन इसमें एसम शामिल है और आमतौर पर जरूरत के अनुसार उच्च lvl आवरण होते हैं।
टीसी 1

36

यदि आप समझते हैं कि "बिट्स 3 और 8 सेट किए गए हैं", "स्पष्ट बिट 5" या "बिट्स 7-12 द्वारा दर्शाया गया पूर्णांक मान ज्ञात करें" जैसी समस्याओं को कैसे हल किया जाए, तो आप बिटवाइज ऑपरेटरों की समझ की पर्याप्त जांच कर सकते हैं। "अच्छी तरह गोल" चेकलिस्ट पर ट्विकल बिट्स बॉक्स।

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

यहां तक ​​कि अगर आप इन एल्गोरिदम को नहीं समझते हैं, तो बस उन्हें जानने से आपके "गोलपन" में वृद्धि होती है क्योंकि जब समय के साथ निपटने के लिए कहते हैं, तो उच्च-प्रदर्शन बिट गिनती, आपको पता है कि क्या अध्ययन करना है। Google की पूर्व दुनिया में, इन चीजों के बारे में पता लगाना बहुत कठिन था; अब यह दूर है।

आपके SO प्रश्न का उत्तर देने वाले उपयोगकर्ता ने हैशिंग का अध्ययन करने या अध्ययन करने से पहले समस्या देखी होगी। उसे लिखें और पूछें।


कम से कम इन चीजों के बारे में पता होना। थोड़ा बहुत जानना बहुत अच्छी बात है। यदि उद्योग के लोग इस तरह से सामान के बारे में बात करना शुरू करते हैं, तो आप उस कमरे में नहीं रहना चाहते हैं, जिसके बारे में थोड़ी सी भी चर्चा नहीं की गई है।
maple_shaft

3
उपरोक्त कोड टिप्पणी में संक्षिप्त नाम "HD" को हल करने के लिए +1।
पेटर तोर्क

मैं इस तरह के सामान से प्यार करता हूं और बस एचडी बुक का आदेश दिया। संदर्भ के लिए धन्यवाद।
tcrosley

8

आपके उदाहरण से कुछ चीजें हैं जो आपको वास्तव में बिना सोचे समझे जानी चाहिए।

1143 i = i - ((i >>> 1) & 0x55555555);

आपको बिट पैटर्न 0x555 को पहचानना चाहिए ... एक वैकल्पिक बिट पैटर्न के रूप में 0101 0101 0101 और यह कि ऑपरेटर इसे 1 बिट (दाएं) से ऑफसेट कर रहे हैं, और यह एक मास्किंग ऑपरेशन है (और मास्किंग का मतलब क्या है)।

1144 i = (i & 0x33333333) + ((i >>> 2) और 0x33333333);

फिर से एक पैटर्न, यह एक 0011 0011 0011 है। यह भी कि यह इस बार दो बदलाव कर रहा है और फिर से मास्किंग कर रहा है। स्थानांतरण और मास्किंग एक पैटर्न का पालन कर रहा है जिसे आपको पहचानना चाहिए ...

1145 i = (i + (i >>> 4)) & 0x0f0f0f0f;

पैटर्न जम जाता है। इस बार यह 00001111 00001111 है और निश्चित रूप से, हम इसे इस बार 4 में बदल रहे हैं। हर बार हम नकाब के आकार के अनुसार बदल रहे हैं।

1148 वापसी i & 0x3f;

एक और बिट पैटर्न, 3f शून्य का एक ब्लॉक है जिसके बाद एक बड़ा ब्लॉक होता है।

इन सभी चीजों को एक नज़र में स्पष्ट होना चाहिए यदि आप "वेल राउंडेड" हैं। यहां तक ​​कि अगर आपको कभी नहीं लगता कि आप इसका उपयोग करेंगे, तो आप शायद अपने कोड को सरल बनाने के लिए कुछ अवसरों को याद करेंगे यदि आप यह नहीं जानते हैं।

उच्च स्तर की भाषा में भी, छोटे पेटेंट का उपयोग MUCH की बड़ी मात्रा को छोटे क्षेत्रों में संग्रहीत करने के लिए किया जाता है। यही कारण है कि आप हमेशा खेल में 127/8, 63/4 और 255/6 की सीमाएं देखते हैं, ऐसा इसलिए है क्योंकि आपको इनमें से बहुत सी चीजों को स्टोर करना होगा ताकि खेतों को पैक किए बिना आप दस गुना ज्यादा इस्तेमाल करने के लिए मजबूर हो जाएं। स्मृति की मात्रा। (ठीक है, अंतिम होगा यदि आपको किसी सरणी में विशाल संख्या में बूलियनों को संग्रहीत करने की आवश्यकता होती है, तो आप 32-64 बार मेमोरी की मात्रा को बचा सकते हैं यदि आप इसके बारे में नहीं सोचते थे, तो - अधिकांश भाषाएं बूलियनों को लागू करती हैं। एक शब्द जो प्रायः 32 बिट्स का होगा। जो इस स्तर पर सहज महसूस नहीं करते हैं वे इस तरह से डेटा स्टोर करने के अवसरों का विरोध करेंगे क्योंकि वे अज्ञात से डरते हैं।

वे मैन्युअल रूप से पार्सिंग पैकेट जैसी चीज़ों से भी दूर भागेंगे, जो पैक्ड फॉर्मेट में नेटवर्क पर दिया जाता है - कुछ ऐसा जो तुच्छ होने पर भी आपको डर नहीं लगता। यह 200 बाइट की आवश्यकता के लिए 1k पैकेट की आवश्यकता वाले गेम को ले सकता है, छोटा पैकेट अधिक कुशलता से नेटवर्क के माध्यम से स्लाइड करेगा और विलंबता को कम करेगा और उच्च इंटरैक्शन गति को सक्षम करेगा (जो गेम के लिए पूरे नए मोड को सक्षम कर सकता है)।


5

मैं कोड को पहचानने के लिए हुआ क्योंकि मैंने वीडियो फ्रेम में हेरफेर करने के लिए सॉफ्टवेयर में इसे पहले देखा है। यदि आप नियमित रूप से ऑडियो और वीडियो CODECs, नेटवर्किंग प्रोटोकॉल या चिप रजिस्टरों जैसी चीजों के साथ काम करते हैं, तो आपको बहुत से बिटवाइज़ ऑपरेशंस दिखाई देंगे और यह आपके लिए दूसरा स्वभाव बन जाएगा।

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


4

मुख्य बातों से आपको अवगत होना चाहिए कि पूर्णांकों का प्रतिनिधित्व कैसे किया जाता है (सामान्य रूप से एक निश्चित-लंबाई वाले बिटवेक्टर जहां लंबाई प्लेटफ़ॉर्म-निर्भर है) और उन पर कौन से संचालन उपलब्ध हैं।

मुख्य अंकगणितीय संचालन + - * / %को समझने की आवश्यकता के बिना समझा जा सकता है हालांकि यह सूक्ष्म-अनुकूलन के लिए आसान हो सकता है (हालांकि अधिकांश समय संकलक आपके लिए देखभाल करने में सक्षम होंगे)

थोड़ा हेरफेर सेट का | & ~ ^ << >> >>>उपयोग करने में सक्षम होने के लिए कम से कम एक गुजर समझ की आवश्यकता होती है

हालाँकि, अधिकांश समय आप केवल एक विधि के रूप में बिट झंडे को पास करने के लिए ORऔर इंट को पास करने के लिए उनका उपयोग करेंगे और फिर ANDसेटिंग्स को एक लंबी पैरामीटर सूची में कई (32 से अधिक) बूलियनों को पारित करने की तुलना में अधिक पठनीय है और अनुमति देता है इंटरफ़ेस को बदलने के बिना संभव झंडे को बदलने के लिए

बूलियन का उल्लेख नहीं करने के लिए आम तौर पर अलग-अलग बाइट्स या इन्ट्स में अलग-अलग रखे जाते हैं, जैसे कि झंडे करता है


कोड स्निपेट के रूप में यह बिट्स की एक समानांतर गणना करता है, यह एल्गोरिथ्म को चलाने की अनुमति देता है O(log(n))जहां n अनुभवहीन लूप के बजाय बिट्स की संख्या है जो हैO(n)

पहले कदम के लिए बहुत मुश्किल समझने के लिए है, लेकिन आप सेटअप यह बिट दृश्यों को बदलने के लिए है कि से शुरू करता है, तो 0b00करने के लिए 0b00, 0b01करने के लिए 0b01, 0b10करने के लिए 0b01और 0b11करने के लिए 0b10इसे का पालन करने के लिए आसान हो जाता है

इसलिए पहले कदम के लिए i - ((i >>> 1) & 0x55555555)अगर हम iसमान के बराबर हैं 0b00_01_10_11तो इसका आउटपुट होना चाहिए0b00_01_01_10

(ध्यान दें जो 0x5बराबर है 0b0101)

iuf हम ले i = 0b00_01_10_11इस का मतलब है कि 0b00_01_01_10 - (0b00_00_11_01 & 0b01_01_01_01)है 0b00_01_10_11 - 0b00_00_01_01बदले में हो जाता है जो0b00_01_01_10

वे (i & 0x55555555) + ((i >>> 1) & 0x55555555)एक ही परिणाम के लिए कर सकते थे, लेकिन यह 1 अतिरिक्त ऑपरेशन है

निम्नलिखित चरण एक समान नस में हैं


4
इस कोड का सबसे महत्वपूर्ण गुण यह है कि यह शाखा मुक्त है, जो शायद जटिलता में कमी से भी अधिक लाभ देता है।
साइमन रिक्टर

3

सभी को बुनियादी बिट-वार संचालन को समझना चाहिए। यह कार्यों का एक अनुकूलित, मजबूत तरीके से प्रदर्शन करने के लिए बुनियादी संचालन की संरचना है जो बहुत अभ्यास करता है।

जो लोग हर रोज़ थोड़े हेरफेर के साथ काम करते हैं (जैसे एम्बेडेड लोग), ज़ाहिर है, मजबूत अंतर्ज्ञान और चाल का एक अच्छा बैग विकसित करने के लिए जा रहा है।

एक प्रोग्रामर को कितना कौशल होना चाहिए जो निम्न-स्तरीय सामान नहीं करता है जिसमें बिट-वार हेरफेर होता है? पर्याप्त एक छंद के साथ बैठने में सक्षम होने के लिए जैसे कि आप चिपकाए गए और इसके माध्यम से धीरे-धीरे काम करें जैसे कि यह एक मस्तिष्क टीज़र और पहेली था।

उसी टोकन के द्वारा, मैं कहूंगा कि एक एम्बेडेड प्रोग्रामर को http के बारे में उतना ही समझना चाहिए जितना कि एक वेब देव बिट-वार हेरफेर के बारे में समझता है। दूसरे शब्दों में, यह "ठीक है" बिट हेरफेर में नहीं होने के लिए यदि आप इसे हर समय उपयोग नहीं कर रहे हैं।


3
वास्तव में कुछ मामलों में एक एम्बेडेड प्रोग्रामर को वेब डेवलपर (मैं दोनों करते हैं) की तुलना में http के बारे में अधिक समझना पड़ता है। वेब विकास करना, आप आमतौर पर किसी प्रकार के ढांचे पर भरोसा कर सकते हैं। इंटरनेट से जुड़े उपकरणों के साथ काम करने वाले एक एम्बेडेड डेवलपर के रूप में, मुझे खरोंच से एक http स्टैक को कोड करना पड़ा है।
tcrosley

@ बार-बार, हां, आप बिल्कुल सही हैं। शायद "http" से बेहतर उदाहरण "ORM" या "JEE" जैसा कुछ होगा। मुख्य बात यह है कि आम तौर पर कुछ विषय पर महारत नहीं हो सकती है जब तक कि वे नियमित रूप से इसका अभ्यास नहीं करते हैं।
एंजेलो

मैं सहमत हूं, और मुझे कभी भी ORM या JEE (जब इसे J2ME कहा जाता था, तो वापस JME से निपटना नहीं पड़ा)।
tcrosley

3

हैकर की प्रसन्नता एक व्युत्पन्न कार्य है। सभी के पूर्वज 1972 से HakMem है http://w3.pppl.gov/~Hammett/work/2009/AIM-239-ocr.pdf

महत्वपूर्ण बात यह जानना है कि किसी भी कार्य के लिए स्पष्ट एल्गोरिथ्म आवश्यक रूप से सबसे अच्छा नहीं है। ऐसे कई मामले हैं जहां एक पक्षपाती समस्या के सुरुचिपूर्ण समाधान के अस्तित्व के बारे में जानना महत्वपूर्ण है।



3

व्याख्या करने के लिए बिटवाइज़ ऑपरेटर कितना कठिन हैं?

मैं एम्बेडेड सिस्टम प्रोग्राम करता हूं। मैंने इस सामान का बहुत अभ्यास किया है। कोड के साथ हैश नक्शे के बारे में आपका जुड़ा हुआ प्रश्न

static int hash(int h) {
   // This function ensures that hashCodes that differ only by
   // constant multiples at each bit position have a bounded
   // number of collisions (approximately 8 at default load factor).
   h ^= (h >>> 20) ^ (h >>> 12);
   return h ^ (h >>> 7) ^ (h >>> 4);
}

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

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

एक सादृश्य

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

मुझे पता है कि regex के निम्नलिखित तत्वों का उपयोग कैसे किया जाता है:

  • [] चरित्र वर्ग
  • *, ., और +वाइल्डकार्ड
  • स्ट्रिंग की शुरुआत और स्ट्रिंग ^का अंत$
  • \ D, \ w, और \ n वर्ण वर्ग
  • / जी झंडा

यह सरल प्रश्नों को शिल्प करने के लिए पर्याप्त है, और मेरे द्वारा देखे गए कई प्रश्न इससे बहुत दूर नहीं जाते हैं।

इस सूची में कुछ भी नहीं, मैं एक धोखा पत्र के लिए पहुंचता हूं। कुछ भी, कि है, को छोड़कर {}और ()- नकल पुस्तिकाओं के लिए पर्याप्त नहीं होगा। मुझे इन लोगों के बारे में बस इतना पता है कि मुझे एक व्हाइटबोर्ड, एक संदर्भ पुस्तिका और शायद एक सहकर्मी की आवश्यकता है। आप कुछ पागल एल्गोरिदम को रेगेक्स की कुछ छोटी लाइनों में पैक कर सकते हैं।

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

क्या यह वह जगह है जहाँ आप बिटवाइज़ ऑपरेटरों के साथ हैं?

तो आप अच्छी तरह से गोल होना चाहते हैं?

मेरे अनुमान में, यदि आप यह व्याख्या करने में सक्षम हैं कि इस तरह का कोड कागज़ का एक टुकड़ा निकालकर या व्हाइटबोर्ड पर जाकर मैन्युअल रूप से संचालन के माध्यम से चलता है, तो आप अच्छी तरह से गोल के रूप में योग्य हैं। बिटवाइज़ ऑपरेशंस के क्षेत्र में एक अच्छी तरह से गोल प्रोग्रामर के रूप में अर्हता प्राप्त करने के लिए आपको चार काम करने में सक्षम होना चाहिए:

  1. पढ़ सकते हैं और आम संचालन लिखने fluidly करने में सक्षम हो
    एक आवेदन पत्र प्रोग्रामर के लिए, बिटवाइज़ ऑपरेटर्स के साथ आम आपरेशन के बुनियादी ऑपरेटरों शामिल |और &सेट और स्पष्ट झंडे को। यह आसान होना चाहिए। आपको सामान को पढ़ने और लिखने में सक्षम होना चाहिए

    open('file', O_WRONLY | O_APPEND | O_CREAT );
    // Use an OR operator ^ here and ^ here to set multiple flags
    

    धीमा किए बिना (आप यह जानते हैं कि झंडे का मतलब क्या है )।

  2. कुछ कार्यों के साथ अधिक जटिल संचालन को पढ़ने में सक्षम हो
    । बिट्स वास्तव में तेजी से ओ (लॉग (एन)) शाखाओं के बिना समय सुनिश्चित करता है, यह सुनिश्चित करता है कि हैशकोड में टकराव की संख्या एक बंधी हुई राशि, और ईमेल पते , फोन नंबर , या पार्स करने से भिन्न हो सकती है। Regex के साथ HTML कठिन समस्याएं हैं। यह उन लोगों के लिए उचित है जो इन क्षेत्रों में एक विशेषज्ञ नहीं हैं जो व्हाइटबोर्ड तक पहुंचने के लिए हैं, यह समझने के लिए काम करना शुरू करने में असमर्थ होने के लिए अनुचित है।

  3. बहुत सारे काम के साथ कुछ जटिल एल्गोरिदम लिखने में सक्षम रहें
    यदि आप विशेषज्ञ नहीं हैं, तो आपको जटिल और कठिन सामान करने में सक्षम होने की उम्मीद नहीं करनी चाहिए। हालांकि, एक अच्छा प्रोग्रामर को लगातार इस पर काम करके इसे प्राप्त करने में सक्षम होना चाहिए। यह पर्याप्त करो, और आप जल्द ही एक विशेषज्ञ होंगे :)


2

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

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


2

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

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

आप कहते हैं "मैं मदद नहीं कर सकता लेकिन जब मैं इसे देखता हूं तो बेवकूफ महसूस करता हूं"। मत करो - गुस्सा महसूस करो।

आप सिर्फ एक चरवाहे प्रोग्रामर के आउटपुट से मिले हैं।

क्या उसे मेंटेनेंस कोड लिखने के बारे में कुछ नहीं पता है? मुझे पूरी उम्मीद है कि वह वही है जिसे एक साल में इस पर वापस आना है और कोशिश करें और याद रखें कि इसका क्या मतलब है।

मुझे नहीं पता कि आप टिप्पणियों को काटते हैं या यदि कोई नहीं था, लेकिन यह कोड कोड समीक्षा पास नहीं करेगा जहां मैं एस / डब्ल्यू क्यूए प्रबंधक था (और मैं कुछ बार रहा हूं)।

यहां अंगूठे का एक अच्छा नियम है - केवल "नग्न पूर्णांक" कोड में अनुमेय हैं 0 1nd 1. आपकी भाषा के आधार पर अन्य सभी संख्याएं #defines, cost, enums, आदि होनी चाहिए।

यदि उन 3 और 0x33333333 ने NUM_WIDGET_SHIFT_BITS और WIDGET_READ_MASK जैसे कुछ कहा है, तो कोड को पढ़ना आसान हो जाएगा।

शोमे पर शर्म ने इसे एक ओपन सोर्स प्रोजेक्ट में डाल दिया, लेकिन यहां तक ​​कि व्यक्तिगत कोड के लिए भी अच्छी तरह से टिप्पणी की और सार्थक परिभाषित / enums का उपयोग किया और अपने स्वयं के कोडिंग मानक हैं।


मुझे लगता है कि हेक्स स्थिरांक भी अनुमेय होगा। 0xFF00की तुलना में बहुत अधिक पठनीय (मेरे लिए) है 0b1111111100000000। मैं सेट किए गए बिट्स की संख्या निर्धारित करने के लिए गिनना नहीं चाहता।
केविन वर्मेयर

1

कोड के इस विशेष टुकड़े को सीधे पुस्तक हैकर डिलाइट , आकृति 5.2 से बाहर ले जाया जाता है । सी में इसका ऑनलाइन (पॉप फंक्शन) यहां । नोट करें कि लेखक अब अद्यतन संस्करणों का उपयोग करने की सिफारिश करता है: http://www.hackersdelight.org/HDcode/newCode/pop_arrayHS.c.txt

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

यह भी बाइनरी में सभी हेक्साडेसिमल संख्याओं को फिर से लिखने के लिए एल्गोरिदम के इन प्रकारों को समझने और एक परीक्षण मामले या दो पर उनके माध्यम से काम करने में मदद करता है।


1

उदाहरण द्वारा स्पष्टीकरण। डेटा बिट्स के अनुक्रम हैं। निम्नलिखित कार्यों के लिए उपलब्ध बाइट 01001101 पर बिट्स की गणना करें: 1. हम अंतिम बिट के मूल्य की जांच कर सकते हैं। 2. हम अनुक्रम को स्थानांतरित कर सकते हैं।

  1. 01001101 -> अंतिम बाइट 1, कुल = 1 है। बदलाव
  2. 10100110 -> अंतिम बाइट 0, कुल = 1 है। बदलाव
  3. 01010011 -> अंतिम बाइट 1, कुल = 2 है। बदलाव
  4. 10101001 -> अंतिम बाइट 1, कुल = 3 है। बदलाव
  5. 11010100 -> अंतिम बाइट 0, कुल = 3 है। बदलाव
  6. 01101010 -> अंतिम बाइट 0, कुल = 3 है। बदलाव
  7. 00110101 -> अंतिम बाइट 1, कुल = 4 है। बदलाव
  8. 10011010 -> अंतिम बाइट 0, कुल = 4 है। बदलाव

हमारा जवाब: 4

यह कठिन नहीं था, क्या यह था? बिटवाइज़ ऑपरेशंस के साथ बड़ी बात यह है कि सीमित चीजें हैं जो हम कर सकते हैं। हम सीधे पहुंच नहीं सकते। उदाहरण के लिए, हम पिछले बिट के मूल्य को MASK 00000001 से तुलना कर सकते हैं और हम हर बिट को शिफ्ट ऑपरेशन के साथ अंतिम बना सकते हैं। बेशक, परिणामी एल्गोरिथ्म उन लोगों के लिए डरावना लगेगा जो इस्तेमाल नहीं किए गए थे। बुद्धि से कोई लेना-देना नहीं।


0

मैं यह नहीं कहूंगा कि जब तक आप जो काम कर रहे हैं वह आपको इसकी आवश्यकता नहीं है:

  • ऑडियो प्रसंस्करण
  • वीडियो प्रसंस्करण
  • ग्राफिक्स
  • नेटवर्किंग (विशेषकर जहां पैकेट का आकार महत्वपूर्ण है)
  • भारी मात्रा में डेटा

यूनिक्स शैली के झंडे में अनुमतियाँ संग्रहीत करना भी इसके लिए एक और उपयोग है, यदि आपके पास अपने सिस्टम के लिए विशेष रूप से जटिल अनुमति मॉडल है, या वास्तव में पठनीयता की कीमत पर सब कुछ एक ही बाइट में रटना चाहते हैं।

उन क्षेत्रों के अलावा मैं इसे एक बड़े प्लस के रूप में गिना जाऊंगा यदि कोई डेवलपर / वरिष्ठ डेवलपर बिट शिफ्टिंग, और उपयोग कर सकता है & ^ के रूप में यह पेशे में रुचि दिखाती है जिसे आप कह सकते हैं कि यह अधिक स्थिर और विश्वसनीय कोड है।

जहाँ तक पहली नज़र में विधि को 'प्राप्त' करने का नहीं है, जैसा कि आपको बताया गया है कि यह क्या कर रहा है और कुछ पृष्ठभूमि की व्याख्या की आवश्यकता है। मैं यह नहीं कहूंगा कि यह बुद्धिमत्ता से संबंधित है, लेकिन आप दिन-प्रतिदिन के आधार पर हेक्साडेसिमल के साथ काम करने से कितने परिचित हैं और समस्याओं को पहचान कर कुछ पैटर्न हल कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.