हैमिंग वेट

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

यह भी देखें

 * दो का अनुपूरण
 * प्रशंसक बाहर

अग्रिम पठन

 * (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