http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel से
unsigned int v; // count bits set in this (32-bit value)
unsigned int c; // store the total here
c = v - ((v >> 1) & 0x55555555);
c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
c = ((c >> 4) + c) & 0x0F0F0F0F;
c = ((c >> 8) + c) & 0x00FF00FF;
c = ((c >> 16) + c) & 0x0000FFFF;
संपादित: यह सच है कि यह थोड़ा अनुकूलित जो यह मुश्किल पढ़ा जा सकता है है। यह रूप में पढ़ने के लिए आसान है:
c = (v & 0x55555555) + ((v >> 1) & 0x55555555);
c = (c & 0x33333333) + ((c >> 2) & 0x33333333);
c = (c & 0x0F0F0F0F) + ((c >> 4) & 0x0F0F0F0F);
c = (c & 0x00FF00FF) + ((c >> 8) & 0x00FF00FF);
c = (c & 0x0000FFFF) + ((c >> 16)& 0x0000FFFF);
इन पाँच में से हर कदम, पड़ोसी बिट्स एक साथ विधि विभाजन में स्थित है और जीत है कहते हैं 1 के समूहों, तो 2 में और फिर 4 आदि ।
पहले चरण में हम बिट्स 0 और 1 जोड़ते हैं और परिणाम को दो बिट सेगमेंट 0-1 में डालते हैं, बिट्स 2 और 3 जोड़ते हैं और परिणाम को दो-बिट सेगमेंट 2-3 आदि में डाल देते हैं ...
दूसरे चरण में हम दो-बिट 0-1 और 2-3 जोड़ते हैं और परिणाम को चार-बिट 0-3 में डालते हैं, दो-बिट 4-5 और 6-7 जोड़ते हैं और परिणाम डालते हैं चार-बिट में 4-7 आदि ...
उदाहरण:
So if I have number 395 in binary 0000000110001011 (0 0 0 0 0 0 0 1 1 0 0 0 1 0 1 1)
After the first step I have: 0000000101000110 (0+0 0+0 0+0 0+1 1+0 0+0 1+0 1+1) = 00 00 00 01 01 00 01 10
In the second step I have: 0000000100010011 (00+00 00+01 01+00 01+10) = 0000 0001 0001 0011
In the fourth step I have: 0000000100000100 ( 0000+0001 0001+0011 ) = 00000001 00000100
In the last step I have: 0000000000000101 ( 00000001+00000100 )
जो जो सही परिणाम है 5 के बराबर है,
धन्यवाद। मुझे खेद है, मैं पूरी तरह समझ नहीं पा रहा हूं कि यह क्यों काम करता है। क्या आप – JAM
समझा सकते हैं मैंने एक स्पष्टीकरण जोड़ा, इसमें थोड़ी देर लग गई क्योंकि मुझे खुद को समझना था कि क्या हो रहा था। मुझे समझने के लिए मजबूर करने के लिए अपने प्रश्न पर +1: पी – iniju
यह उत्तर भी देखें, जो इस चरण के माध्यम से कदम से चलता है: http://stackoverflow.com/a/15979139/31818 – seh