सवाल क्या आपको कभी असली परियोजनाओं में थोड़ा स्थानांतरित करना पड़ा है?


क्या आपको कभी उपयोग करना पड़ा है थोड़ा स्थानांतरण असली प्रोग्रामिंग परियोजनाओं में? अधिकांश (यदि नहीं सभी) उच्च स्तरीय भाषाओं में उनमें शिफ्ट ऑपरेटर होते हैं, लेकिन आपको वास्तव में उनका उपयोग करने की आवश्यकता कब होगी?


76


मूल




जवाब:


मैं अभी भी उन सिस्टम के लिए कोड लिखता हूं जिनमें हार्डवेयर में फ़्लोटिंग पॉइंट समर्थन नहीं है। इन प्रणालियों में आपको लगभग अपने सभी अंकगणित के लिए बिट-स्थानांतरण की आवश्यकता है।

इसके अलावा आपको हैश उत्पन्न करने के लिए बदलाव की आवश्यकता है। बहुपद अंकगणितीय (सीआरसी, रीड-सोलोमन कोड मुख्यधारा के अनुप्रयोग हैं) या शिफ्ट का भी उपयोग करता है।

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

कंपाइलर उन मामलों का पता लगाते हैं जहां गुणा को एक शिफ्ट में कम किया जा सकता है।


49





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

संपादित करें: इसके अलावा, मैं बिटमैप्स में हेरफेर करने के लिए बहुत कुछ उपयोग करता हूं, उदाहरण के लिए रंग गहराई को बदलना, या आरजीबी <-> बीजीआर को परिवर्तित करना।


35



Seconded। मैं बहुत सारे एम्बेडेड प्रोग्रामिंग करता हूं, और बिट स्थानांतरण एक आम ऑपरेशन है। - e.James
आरजीबी <-> यहां बीजीआर रूपांतरण। - Neil N


  • Enums के लिए अच्छा ध्वज मान बनाना (मैन्युअल रूप से 1, 2, 4 टाइप करने के बजाय ...)
  • बिट-फ़ील्ड से डेटा अनपॅक करना (कई नेटवर्क प्रोटोकॉल उनका उपयोग करते हैं)
  • जेड-वक्र ट्रैवर्सल
  • प्रदर्शन हैक्स

और जब वे इस्तेमाल किए जा रहे हैं तो मैं कई मामलों के बारे में नहीं सोच सकता। यह आमतौर पर अन्य तरीकों से होता है - कुछ विशिष्ट समस्या होती है, और यह पता चला है कि बिट ऑपरेशंस को नियोजित करने से सर्वोत्तम परिणाम मिलेंगे (आमतौर पर प्रदर्शन - समय और / या स्थान की अवधि में)।


24



उदाहरण के लिए आपको स्टोर करने की आवश्यकता हो सकती है shortएक में है intदो अलग-अलग मूल्यों को पढ़ने के लिए सत्र पढ़ने और लॉक करने के ऊपरी हिस्से के बिना ASP.net में सत्र स्थिति में ईगर क्षेत्र। सत्र में दो मानों को संग्रहीत करने के मेमोरी ओवरहेड भी सहेजे गए हैं। - David d C e Freitas


क्रॉस-प्लेटफार्म अनुप्रयोगों के लिए पूर्णांक के एंडियन-नेस को ट्रांसफर करते समय एक स्थान मैं उन्हें हर समय उपयोग करता हूं। 2 डी ग्राफिक्स को मारते समय वे कभी-कभी काम में आते हैं (अन्य बिट-मैनिपुलेशन ऑपरेटर के साथ)।


14



सेकेंड, ईबीसीडीआईसी चरित्र सेट के लिए कनवर्टर लिखना। दुर्भाग्यवश, यह वास्तव में उच्च स्तर की भाषा में निम्न स्तर का काम कर रहा है, लेकिन कुछ मामलों में यह आवश्यक है। - Michael Meadows


मैंने उन्हें कुछ बार उपयोग किया है, लेकिन बाइनरी फ़ाइल स्वरूप को पार्स करने के लिए हमेशा काफी कुछ है।


8





यहां उचित लेख: http://greatjustice.info/the-lost-art-of-bitmasks/


6



वह लिंक अब 404 देता है - Bryan Oakley
आप अभी भी इसे यहां एक्सेस कर सकते हैं: web.archive.org/web/20090406021150/http://greatjustice.info/... - Software Guy


बिट बदलाव तेजी से हैं। उन्हें विभाजन से पहले सीपीयू निर्देश सेट में लागू किया गया था और मॉड्यूलस ऑपरेशन थे। हम में से कई ने अंकगणित के लिए बिट शिफ्ट का उपयोग किया है जो पेंसिल और पेपर पर सरल है, लेकिन हमारे सीपीयू पर उपलब्ध नहीं है।

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

  • मैंने परियोजनाओं के लिए बिट बदलावों का उपयोग किया है बड़े कंपोजिट फैक्टरिंग शामिल है अपने प्रमुख कारकों में।
  • मैंने थोड़ा बदलाव भी किया है वर्ग और घन रूट खोजना मनमाने ढंग से बड़े पूर्णांक।

6



क्या आप कृपया उदाहरण के लिए क्यूब या स्क्वायर रूट खोजने के लिए इसका उपयोग कैसे कर सकते हैं? मैं थोड़ा सा नहीं देखता कि यह कैसे किया जा सकता है। - Xsmael


हाँ, फिर भी इसकी आवश्यकता है।

यहां उदाहरण के लिए मेरे काम में हम सीरियल पोर्ट कॉमक्स के माध्यम से पीएलसी के साथ कम्यूनिकेशन के लिए सॉफ्टवेयर विकसित करते हैं। एक बाइट के भीतर बिट्स को संभालना आवश्यक है, हम शिफ्ट बाएं / दाएं, और तर्क ऑपरेटर या, एक्सओआर, और दिन-प्रतिदिन उपयोग करते हैं।

उदाहरण के लिए, मान लें कि हमें बाइट के बिट 3 (दाएं से बाएं) को चालू करने की आवश्यकता है:

यह करने के लिए और अधिक कुशल है:

Byte B;

B := B XOR 4;

के बजाय:

Byte B = 0;
String s;  // 0 based index

s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);

सादर।


5



आप जोड़ना चाहेंगे क्यों 4 बिट 3 से संबंधित है (दाएं से बाएं) - HCP
क्यों [5]? यह एस [2] नहीं होना चाहिए? - IamIC
बी: = बी एक्सओआर 4; इस मामले में, विशिष्ट बिट चालू करने के लिए, यह सिर्फ OR नहीं होना चाहिए? एक्सओआर टॉगलिंग के लिए इस्तेमाल नहीं किया जाता है? stackoverflow.com/questions/47981/... - Hari


जब मैंने असेंबली भाषा में लिखा था, तो मेरा कोड बिट-स्थानांतरण और मास्किंग से भरा था।

क्या यह सी में भी उचित मात्रा में था।

जावास्क्रिप्ट या सर्वर भाषाओं में यह बहुत कुछ नहीं किया है।

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

उदाहरण के लिए, यदि आपके पास 8 बिट हैं, तो आप "if (a> 127) {...}" के साथ शीर्ष बिट की जांच करें। फिर आपने शिफ्ट छोड़ा (या 2 से गुणा करें), 127 के साथ "और" करें (या आखिरी बिट सेट होने पर 256 का घटाव करें), और फिर से करें।


4





मैंने उन्हें छवि संपीड़न / डिकंप्रेशन में बहुत उपयोग किया, जहां बिटमैप में बिट्स संपीड़ित किए गए थे। का उपयोग करते हुए http://en.wikipedia.org/wiki/Huffman_coding संपीड़ित चीजों में बिट्स की विभिन्न संख्याएं शामिल हैं (वे सभी बाइट-गठबंधन नहीं हैं), और इसलिए जब आप उन्हें एन्कोड या डीकोड करते हैं तो उन्हें थोड़ा-सा स्थानांतरित करने की आवश्यकता होती है।


3