हैमिंग वेट

स्ट्रिंग का हैमिंग वजन (कंप्यूटर विज्ञान) उन प्रतीकों की संख्या है जो प्रयुक्त वर्णमाला के शून्य-प्रतीक से भिन्न होते हैं। इस प्रकार यह समान लंबाई की पूर्ण-शून्य स्ट्रिंग से हैमिंग दूरी के सामान्य है। सबसे विशिष्ट स्थिति के लिए, अंश की स्ट्रिंग, यह स्ट्रिंग में 1 की संख्या है, या किसी दिए गए नंबर की बाइनरी अंक प्रणाली का अंक योग और टैक्सीकैब ज्यामिति या ℓ₁ बिट सदिश का मानदंड इस द्विआधारी स्थिति में, इसे जनसंख्या गणना भी कहा जाता है, पॉपकाउंट, पार्श्व में योग, या बिट योग का उपयोग किया जाता है.

इतिहास और उपयोग
हैमिंग वेट का नाम रिचर्ड हैमिंग के नाम पर रखा गया है, चूँकि उन्होंने इस धारणा की उत्पत्ति नहीं की थी। बाइनरी संख्याओं के हैमिंग वेट का उपयोग 1899 में जेम्स व्हिटब्रेड ली ग्लैशर द्वारा पास्कल के त्रिकोण की पंक्ति में गोल्ड के अनुक्रम के लिए सूत्र देने के लिए किया गया था। इरविंग एस. रीड ने 1954 में बाइनरी स्थिति में हैमिंग वजन के सामान्य अवधारणा प्रस्तुत की थी।

हैमिंग वेट का उपयोग सूचना सिद्धांत, कोडिंग सिद्धांत और क्रिप्टोग्राफी सहित कई विषयों में किया जाता है। हैमिंग वज़न के अनुप्रयोगों के उदाहरणों में सम्मिलित हैं:
 * वर्ग द्वारा मॉड्यूलर घातांक में, घातांक e के लिए आवश्यक मॉड्यूलर गुणन की संख्या लॉग है यही कारण है कि आरएसए (एल्गोरिदम) में प्रयुक्त सार्वजनिक कीज मान e को सामान्यतः कम हैमिंग वजन की संख्या के रूप में चुना जाता है।
 * हैमिंग वजन कॉर्ड (वितरित हैश तालिका) में नोड्स के बीच पथ की लंबाई निर्धारित करता है।
 * बायोमेट्रिक डेटाबेस में आईरिसकोड लुकअप सामान्यतः प्रत्येक संग्रहीत रिकॉर्ड के लिए हैमिंग दूरी की गणना करके कार्यान्वित किया जाता है।
 * बिटबोर्ड प्रतिनिधित्व का उपयोग करने वाले कंप्यूटर चेस प्रोग्राम में, बिटबोर्ड का हैमिंग वजन खेल में शेष दिए गए प्रकार के टुकड़ों की संख्या, या खिलाड़ी के टुकड़ों द्वारा नियंत्रित बोर्ड के वर्गों की संख्या देता है, और इसलिए यह महत्वपूर्ण योगदान है किसी पद के मूल्य के लिए शब्द का उपयोग किया जाता है।
 * हैमिंग वेट का उपयोग पहचान एफएफएस ffs(x) = pop(x ^ (x - 1)) का उपयोग करके पहले सेट को कुशलतापूर्वक खोजने के लिए किया जा सकता है। यह स्पार्क जैसे प्लेटफ़ॉर्म पर उपयोगी है जिसमें हार्डवेयर हैमिंग वेट निर्देश हैं किन्तु कोई हार्डवेयर पहले सेट निर्देश नहीं खोजता है।
 * हैमिंग वेट ऑपरेशन की व्याख्या यूनरी अंक प्रणाली से बाइनरी संख्याओं में रूपांतरण के रूप में की जा सकती है।
 * बिट सरणी और तरंगिका वृक्ष जैसी कुछ संक्षिप्त डेटा संरचनाओं के कार्यान्वयन में किया जाता है।

कुशल कार्यान्वयन
क्रिप्टोग्राफी और अन्य अनुप्रयोगों में बिट सरणी की जनसंख्या गणना की अधिकांशतः आवश्यकता होती है। दो शब्दों a और b की हैमिंग दूरी की गणना a एक्स या b के हैमिंग वजन के रूप में की जा सकती है।

इसे कुशलतापूर्वक कैसे कार्यान्वित किया जाए इसकी समस्या का व्यापक अध्ययन किया गया है। इस प्रकार गणना के लिए एकल ऑपरेशन, या बिट वैक्टर पर समानांतर संचालन प्रोसेसर समर्थन हैं। जिन प्रोसेसरों में उन सुविधाओं की कमी है, उनके लिए ज्ञात सर्वोत्तम समाधान ट्री पैटर्न में गिनती जोड़ने पर आधारित हैं। उदाहरण के लिए, 16-बिट बाइनरी संख्या a = 0110 1100 1011 1010 में 1 बिट की संख्या गिनने के लिए, ये ऑपरेशन किए जा सकते हैं:

यहां, ऑपरेशन सी (प्रोग्रामिंग भाषा) के समान हैं X >> Y का अर्थ है X को Y बिट्स द्वारा दाईं ओर स्थानांतरित करना, X और Y का अर्थ है X और Y का बिटवाइज़, और + सामान्य जोड़ है। इस समस्या के लिए ज्ञात सर्वोत्तम एल्गोरिदम ऊपर चित्रित अवधारणा पर आधारित हैं और यहां दिए गए हैं:

उपरोक्त कार्यान्वयन में किसी भी ज्ञात एल्गोरिदम की तुलना में सबसे व्यर्थ स्थिति वाला व्यवहार है। चूँकि, जब किसी मान में कुछ गैर-शून्य बिट्स होने की अपेक्षा होती है, तो इसके अतिरिक्त एल्गोरिदम का उपयोग करना अधिक कुशल हो सकता है जो इन बिट्स को समय में गिनता है। जैसा कि वेगनर ने 1960 में वर्णित किया था, x के साथ x का बिटवाइज़ AND - 1 केवल सबसे कम महत्वपूर्ण गैर-शून्य बिट को शून्य करने में x से भिन्न होता है: 1 घटाने से 0s की सबसे दाईं स्ट्रिंग को 1s में बदल दिया जाता है, और सबसे दाईं ओर 1 को 0 में बदल दिया जाता है। यदि x में मूल रूप से n बिट्स थे जो थे 1, तो इस ऑपरेशन के केवल n पुनरावृत्तियों के बाद, x शून्य हो जाता है। निम्नलिखित कार्यान्वयन इसी सिद्धांत पर आधारित है।

यदि अधिक मेमोरी उपयोग की अनुमति है, जिससे हम उपरोक्त विधियों की तुलना में हैमिंग वजन की तेजी से गणना कर सकते हैं। असीमित मेमोरी के साथ, हम आसानी से प्रत्येक 64 बिट पूर्णांक के हैमिंग वजन की बड़ी लुकअप तालिका बना सकते हैं। यदि हम प्रत्येक 16 बिट पूर्णांक के हैमिंग फ़ंक्शन की लुकअप तालिका संग्रहीत कर सकते हैं, जिससे हम प्रत्येक 32 बिट पूर्णांक के हैमिंग वजन की गणना करने के लिए निम्नलिखित कार्य कर सकते हैं।

मुला एट अल. दिखाया गया है कि पॉपकाउंट 64b का वेक्टरकृत संस्करण समर्पित निर्देशों (उदाहरण के लिए, x64 प्रोसेसर पर पॉपसीएनटी) की तुलना में तेजी से चल सकता है।

न्यूनतम वजन
त्रुटि-सुधार कोड या त्रुटि-सुधार कोडिंग में, न्यूनतम हैमिंग वजन, जिसे सामान्यतः न्यूनतम वजन wmin कहा जाता है कोड का वजन सबसे कम वजन वाले गैर-शून्य कोड शब्द का होता है। किसी कोड शब्द का भार w शब्द में 1s की संख्या है। उदाहरण के लिए, शब्द 11001010 का भार 4 है।

एक रैखिक ब्लॉक कोड में न्यूनतम वजन भी न्यूनतम हैमिंग दूरी (dmin) है और कोड की त्रुटि सुधार क्षमता को परिभाषित करता है। यदि wmin= n, फिर dmin= n और कोड dmin/2 त्रुटियाँ तक सही हो जाता है.

भाषा समर्थन
कुछ सी कंपाइलर आंतरिक कार्य प्रदान करते हैं जो बिट गिनती की सुविधा प्रदान करते हैं। उदाहरण के लिए, जीएनयू कंपाइलर संग्रह (अप्रैल 2004 में संस्करण 3.4 से) में अंतर्निहित फ़ंक्शन सम्मिलित है  यदि उपलब्ध हो तो यह प्रोसेसर निर्देश का उपयोग करेगा या अन्यथा कुशल लाइब्रेरी कार्यान्वयन का उपयोग करता है। एलएलवीएम या एलएलवीएम-जीसीसी ने जून 2005 में संस्करण 1.5 से इस फ़ंक्शन को सम्मिलित किया है।

C++ मानक लाइब्रेरी में, बिट-सरणी डेटा संरचना    वह विधि जो सेट किए गए बिट्स की संख्या को गिनती है। C++20 में, नया हेडर   फ़ंक्शंस युक्त, जोड़ा गया था   और , अहस्ताक्षरित पूर्णांक प्रकारों के तर्क लेता है।

जावा में, बढ़ने योग्य बिट-सरणी डेटा संरचना  विधि जो सेट किए गए बिट्स की संख्या की गणना करती है। इसके अतिरिक्त, वहाँ हैं  और  क्रमशः मौलिक 32-बिट और 64-बिट पूर्णांकों में बिट्स की गिनती करने का कार्य करता है। यह भी  मनमाना-परिशुद्धता पूर्णांक वर्ग में भी है  विधि जो बिट्स की गिनती करती है।

पायथन (प्रोग्रामिंग भाषा) में,  प्रकार में है   सेट बिट्स की संख्या गिनने की विधि यह कार्यक्षमता अक्टूबर 2021 में जारी पायथन 3.10 में प्रस्तुत की गई थी।  सामान्य लिस्प में, फ़ंक्शन , गैर-ऋणात्मक पूर्णांक दिया गया है, इस प्रकार 1 बिट्स की संख्या लौटाता है। (ऋणात्मक पूर्णांकों के लिए यह 2 के पूरक संकेतन में 0 बिट्स की संख्या लौटाता है।) किसी भी स्थिति में पूर्णांक बिग्नम हो सकता है।

ग्लासगो हास्केल कंपाइलर 7.4 से प्रारंभ होकर, हास्केल (प्रोग्रामिंग भाषा) बेस पैकेज में है  फ़ंक्शन सभी प्रकार के उदाहरणों पर उपलब्ध है   कक्षा (से उपलब्ध है   मापांक)।

एसक्यूएल भाषा का मायएसक्यूएल संस्करण प्रदान करता है  मानक फ़ंक्शन के रूप में।

फोरट्रान 2008 में मानक, आंतरिक, मौलिक कार्य है  पूर्णांक (या पूर्णांक सरणी) के भीतर गैर-शून्य बिट्स की संख्या लौटाना।

कुछ प्रोग्रामयोग्य वैज्ञानिक पॉकेट कैलकुलेटर सेट बिट्स की संख्या की गणना करने के लिए विशेष कमांड की सुविधा देते हैं, उदाहरण के लिए  एचपी-16सी पर  और WP 43S,    या    एचपी-16सी एमुलेटर पर, और   WP 34S पर होता है.

फ्रीपास्कल संस्करण 3.0 से पॉपसीएनटी प्रयुक्त करता है।

प्रोसेसर समर्थन

 * 1960 के दशक में आईबीएम स्ट्रेच कंप्यूटर ने सभी तार्किक परिचालनों के उप-उत्पाद के रूप में सेट बिट्स की संख्या के साथ-साथ अग्रणी शून्य की संख्या की गणना की थी।
 * क्रे सुपरकंप्यूटर में प्रारंभ में जनसंख्या गणना मशीन अनुदेश प्रदर्शित किया गया था, ऐसी अफवाह थी कि क्रिप्ट विश्लेषण अनुप्रयोगों के लिए अमेरिकी सरकार की राष्ट्रीय सुरक्षा एजेंसी द्वारा विशेष रूप से अनुरोध किया गया था।
 * नियंत्रण डेटा निगम (सीडीसी) की सीडीसी 6000 श्रृंखला और सीडीसी साइबर या साइबर 70/170 श्रृंखला की मशीनों में जनसंख्या गणना निर्देश सम्मिलित हैं; 60-बिट मशीनों के लिए कम्पास में, इस निर्देश को इस प्रकार . कोडित किया गया था
 * 64-बिट स्पार्क संस्करण 9 आर्किटेक्चर परिभाषित करता है  निर्देश,  किन्तु अधिकांश कार्यान्वयन इसे प्रयुक्त नहीं करते हैं, जिसके लिए ऑपरेटिंग सिस्टम द्वारा इसका अनुकरण करना आवश्यक होता है।
 * डोनाल्ड नुथ का मॉडल कंप्यूटर एमएमआईएक्स जो अपनी पुस्तक कंप्यूटर प्रोग्रामिंग की कला में एमआएक्स का स्थान लेने जा रहा है, उसमें है  1999 से निर्देश।   सभी बिट्स को गिनता है जो b में 1 और c में 0 हैं और परिणाम को a में लिखता है।
 * 1999 में जारी कॉम्पैक का अल्फा 21264A, पहला अल्फा श्रृंखला सीपीयू डिज़ाइन था जिसमें काउंट एक्सटेंशन था.
 * एनालॉग डिवाइस के ब्लैकफ़िन प्रोसेसर की सुविधा है  32-बिट जनसंख्या गणना करने का निर्देश होता है।
 * एएमडी के एएमडी K10 आर्किटेक्चर ने उन्नत बिट मैनिपुलेशन (एबीएम) निर्देश समुच्चय की प्रारंभ की  2007 में SSE4a एक्सटेंशन के भाग के रूप में निर्देश का उपयोग किया है।
 * इण्टेल कोर प्रोसेसर प्रस्तुत किया गया  SSE4.2 इंस्ट्रक्शन सेट एक्सटेंशन के साथ निर्देश, पहली बार नेहलेम (माइक्रोआर्किटेक्चर)-आधारित कोर i7 प्रोसेसर में उपलब्ध है, जो नवंबर 2008 में जारी किया गया था।
 * एआरएम आर्किटेक्चर की प्रारंभ की गई  एआरएम एडवांस्ड सिमड (नियोन (निर्देश सेट) एक्सटेंशन के भाग के रूप में निर्देश का उपयोग किया जाता है।
 * आरआईएससी-वी आर्किटेक्चर की प्रारंभ की गई  बिट मैनिपुलेशन (b) एक्सटेंशन के भाग के रूप में निर्देश का उपयोग किया जाता है।

यह भी देखें

 * दो पूरक
 * फैन आउट

==संदर्भ                                                                                                                                                                                                                                       ==

अग्रिम पठन

 * (Item 169: Population count assembly code for the PDP/6-10.)

बाहरी संबंध

 * Aggregate Magic Algorithms. Optimized population count and other algorithms explained with sample code.
 * Bit Twiddling Hacks Several algorithms with code for counting bits set.
 * Necessary and Sufficient - by Damien Wintour - Has code in C# for various Hamming Weight implementations.
 * Best algorithm to count the number of set bits in a 32-bit integer? - Stackoverflow