<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Jeu George's Blogs</title><subtitle type="html">Pixels, Colors, Graphics, Digital Imaging, C++, Algorithms and everything you can think about.</subtitle><id>http://blogs.msdn.com/jeuge/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/jeuge/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2005-04-20T00:03:00Z</updated><entry><title>Bit Fiddling - 4</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/archive/2005/10/27/445876.aspx" /><id>http://blogs.msdn.com/jeuge/archive/2005/10/27/445876.aspx</id><published>2005-10-28T07:27:00Z</published><updated>2005-10-28T07:27:00Z</updated><content type="html">&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=5&gt;&lt;STRONG&gt;&lt;U&gt;Pre-Computing&lt;/U&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;Pre Computing is a technique normally used to speed up algorithms and by actually computing results of a smaller problem and using interpolation or other techniques to solve a larger problem. You trade-off memory/accuracy for speed here, as you will need to load the pre-computed solutions into memory and/or use interpolation to find solutions to a desired level of accuracy.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;A similar approach can be used to count number of set bits in an integer. Basically, you have a pre-computed array of the number of bits in 4,8 or 16 bit size numbers and use this to find the number of bits in an integer. You could also pre-compute for 32 bit sizes but you will need 2&lt;SUP&gt;34&lt;/SUP&gt; bytes to hold this data &lt;SPAN style="FONT-FAMILY: Wingdings; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;SPAN style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;static&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; PreCompute8 [256] =&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/SPAN&gt;};&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;int&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; BitCountPreCompute (&lt;SPAN style="COLOR: blue"&gt;unsigned&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; u)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: green"&gt;// Valid for 32 bit ints only&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt; mso-layout-grid-align: none"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="COLOR: blue"&gt;return&lt;/SPAN&gt; PreCompute8[u&amp;amp;0xffu] +&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;PreCompute8[(u&amp;gt;&amp;gt;8)&amp;amp;0xffu] +&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;PreCompute8[(u&amp;gt;&amp;gt;16)&amp;amp;0xffu] +&lt;SPAN style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/SPAN&gt;PreCompute8[(u&amp;gt;&amp;gt;24)&amp;amp;0xffu] ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;PreCompute8 holds the number of set bits in for all 8 bit numbers. Using this result, mask out sets of 8 bits in the given integer and index into the PreCompute8 array and compute the count.&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&amp;nbsp;&lt;/P&gt;
&lt;a href="http://www.technorati.com/claim/5q2t5dcwe" rel="me"&gt;Technorati Profile&lt;/a&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=445876" width="1" height="1"&gt;</content><author><name>jeuge</name><uri>http://blogs.msdn.com/members/jeuge.aspx</uri></author><category term="C++" scheme="http://blogs.msdn.com/jeuge/archive/tags/C_2B002B00_/default.aspx" /><category term="programming" scheme="http://blogs.msdn.com/jeuge/archive/tags/programming/default.aspx" /><category term="Algorithms" scheme="http://blogs.msdn.com/jeuge/archive/tags/Algorithms/default.aspx" /></entry><entry><title>Bit Fiddling - 3</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/archive/2005/06/08/HAKMEM-Bit-Count.aspx" /><id>http://blogs.msdn.com/jeuge/archive/2005/06/08/HAKMEM-Bit-Count.aspx</id><published>2005-06-09T03:40:00Z</published><updated>2005-06-09T03:40:00Z</updated><content type="html">&lt;P&gt;Now that we have seen some &lt;A href="https://blogs.msdn.com/jeuge/archive/2005/04/29/Bits_and_Pieces.aspx"&gt;trivial&lt;/A&gt;&amp;nbsp;and&amp;nbsp; &lt;A href="https://blogs.msdn.com/jeuge/archive/2005/05/02/414171.aspx"&gt;fast&lt;/A&gt;&amp;nbsp;approaches to do bit counting. Lets look into one brilliant parallent counting solution.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;&lt;FONT size=5&gt;Parallel&amp;nbsp; Counting&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;U&gt;5.&amp;nbsp; MIT HAKMEM Count&lt;/U&gt;&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;&lt;BR&gt;HAKMEM (Hacks Memo) is a legendary collection of neat mathematical and programming hacks contributed mostly by people at MIT and some elsewhere. This source is from the MIT AI LABS and this brilliant piece of code orginally in assembly was probably conceived in the late 70's. &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;int BitCount(unsigned int u)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int uCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uCount =&amp;nbsp;u - ((u &amp;gt;&amp;gt; 1) &amp;amp; 033333333333) - ((u &amp;gt;&amp;gt; 2) &amp;amp; 011111111111);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((uCount + (uCount &amp;gt;&amp;gt; 3)) &amp;amp; 030707070707) % 63;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Lets take a look at the theory behind this idea.&lt;/P&gt;
&lt;P&gt;Take a 32bit number n;&lt;BR&gt;n =&amp;nbsp; a&lt;SUB&gt;31 * 2&lt;SUP&gt;31 + a&lt;SUB&gt;30 * 2&lt;SUP&gt;30 &lt;/SUP&gt;&lt;/SUB&gt;+.....+ a&lt;SUB&gt;k&lt;/SUB&gt; * 2&lt;SUP&gt;k&amp;nbsp;&lt;/SUP&gt;&amp;nbsp;+....+ a&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt; * 2 + a&lt;SUB&gt;0&lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;;&lt;/P&gt;
&lt;P&gt;Here &lt;SUB&gt;&lt;SUP&gt;a&lt;SUB&gt;0&lt;/SUB&gt; &lt;/SUP&gt;&lt;/SUB&gt;through a&lt;SUB&gt;31&lt;/SUB&gt; are the values of bits (0 or 1) in a 32 bit number. Since the problem at hand is to count the number of set bits in the number, simply summing up these co-efficients would yeild the solution. (&lt;SUB&gt;&lt;SUP&gt;a&lt;SUB&gt;0&lt;/SUB&gt;&amp;nbsp;&lt;/SUP&gt;&lt;/SUB&gt;+ &lt;SUB&gt;&lt;SUP&gt;a&lt;SUB&gt;1 &lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;+..+ &lt;SUB&gt;&lt;SUP&gt;a&lt;SUB&gt;31 &lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;).&lt;/P&gt;
&lt;P&gt;How do we do this programmatically?&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;SUB&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/SUB&gt;&lt;/FONT&gt;&lt;BR&gt;Take the original number n and store in the count variable.&lt;BR&gt;count=n; &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Shift the orignal number 1 bit to the right and subtract from the orignal.&lt;BR&gt;count = n - (n &amp;gt;&amp;gt;1);&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Now Shift the original number 2 bits to the right and subtract from count;&lt;BR&gt;count = n - (n&amp;gt;&amp;gt;1) - (n&amp;gt;&amp;gt;2);&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Keep doing this until you reach the end.&lt;BR&gt;count = n - (n&amp;gt;&amp;gt;1) - (n&amp;gt;&amp;gt;2) - ... -( n&amp;gt;&amp;gt;31);&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Let analyze and see what count holds now.&lt;BR&gt;n&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = a&lt;SUB&gt;31 * 2&lt;SUP&gt;31 + a&lt;SUB&gt;30 * 2&lt;SUP&gt;30 &lt;/SUP&gt;&lt;/SUB&gt;+.....+ a&lt;SUB&gt;k&lt;/SUB&gt; * 2&lt;SUP&gt;k&amp;nbsp;&lt;/SUP&gt;&amp;nbsp;+....+ a&lt;SUB&gt;1&amp;nbsp;&lt;/SUB&gt; * 2 + a&lt;SUB&gt;0&lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;;&lt;/P&gt;
&lt;P&gt;n &amp;gt;&amp;gt; 1 = a&lt;SUB&gt;31 * 2&lt;SUP&gt;30 + a&lt;SUB&gt;30&lt;/SUB&gt; * 2&lt;SUP&gt;29&lt;/SUP&gt;&amp;nbsp;+.....+ a&lt;SUB&gt;k&lt;/SUB&gt; * 2&lt;SUP&gt;k-1&amp;nbsp;&lt;/SUP&gt;&amp;nbsp;+....+ a&lt;SUB&gt;1&lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;;&lt;BR&gt;n &amp;gt;&amp;gt; 2 = a&lt;SUB&gt;31 * 2&lt;SUP&gt;29 + a&lt;SUB&gt;30 * 2&lt;SUP&gt;28 &lt;/SUP&gt;&lt;/SUB&gt;+.....+ a&lt;SUB&gt;k&lt;/SUB&gt;* 2k-2 +....+ a&lt;SUB&gt;2&lt;/P&gt;
&lt;P&gt;&lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;;&lt;BR&gt;..&lt;BR&gt;n &amp;gt;&amp;gt; k = a&lt;SUB&gt;31 * 2&lt;SUP&gt;(31-k) + a&lt;SUB&gt;30 * 2&lt;SUP&gt;(30-k) &lt;/SUP&gt;&lt;/SUB&gt;+.....+ a&lt;SUB&gt;k * 2&lt;SUP&gt;k&lt;/SUP&gt;&lt;/SUB&gt;;&lt;/P&gt;
&lt;P&gt;&lt;/SUP&gt;&lt;/SUB&gt;..&lt;BR&gt;n&amp;gt;&amp;gt;31 = a&lt;SUB&gt;31&lt;/SUB&gt;;&lt;/P&gt;
&lt;P&gt;You can quickly see that: (Hint: &lt;SUP&gt;&lt;SUB&gt;2&lt;SUP&gt;k&lt;/SUP&gt;&lt;/SUB&gt;&lt;/SUP&gt;&amp;nbsp;- 2&lt;SUP&gt;k-1&amp;nbsp;&lt;/SUP&gt;&amp;nbsp;= 2&lt;SUP&gt;k-1 &lt;/SUP&gt;;)&lt;BR&gt;count = n - (n&amp;gt;&amp;gt;1) - (n&amp;gt;&amp;gt;2) - ... -( n&amp;gt;&amp;gt;31) =a&lt;SUB&gt;31&lt;/SUB&gt;+ &lt;SUB&gt;&lt;SUP&gt;a&lt;SUB&gt;30 &lt;/SUB&gt;&lt;/SUP&gt;&lt;/SUB&gt;+..+a&lt;SUB&gt;0&lt;/SUB&gt;;&lt;BR&gt;which is what we are looking for;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;int BitCount(unsigned int u)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int uCount=u;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;u=u&amp;gt;&amp;gt;1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;uCount -= u;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while(u);&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This certainaly is an interesting way to solve this problem. But how do you make this brilliant? Run this in constant time with constant memory!!.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;int BitCount(unsigned int u)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int uCount;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uCount =&amp;nbsp;u - ((u &amp;gt;&amp;gt; 1) &amp;amp; 033333333333) - ((u &amp;gt;&amp;gt; 2) &amp;amp; 011111111111);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ((uCount + (uCount &amp;gt;&amp;gt; 3)) &amp;amp; 030707070707) % 63;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For those of you who are still wondering whats going? Basically use the same idea, but instead of looping over the entire number, sum up the number in blocks of 3 (octal) and count them in parallel.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;After this statement uCount = n - ((n &amp;gt;&amp;gt; 1) &amp;amp; 033333333333) - ((n &amp;gt;&amp;gt; 2) &amp;amp; 011111111111);&lt;BR&gt;uCount has the sum of bits in each octal block spread out through itself. &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;So if you can a block of 3 bits &lt;BR&gt;&lt;/P&gt;
&lt;P&gt;u = a&lt;SUB&gt;2*2&lt;SUP&gt;2 + a&lt;SUB&gt;1&lt;/SUB&gt;*2+ a&lt;SUB&gt;0&lt;/SUB&gt;;&lt;BR&gt;u&amp;gt;&amp;gt;1 = &lt;/SUP&gt;&lt;/SUB&gt;a&lt;SUB&gt;2&lt;SUP&gt;*2 + a&lt;SUB&gt;1&lt;/SUB&gt;;&lt;BR&gt;u&amp;gt;&amp;gt;2 = &lt;/SUP&gt;&lt;/SUB&gt;a&lt;SUB&gt;2&lt;SUP&gt;;&lt;BR&gt;&lt;/SUP&gt;&lt;/SUB&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;u&amp;nbsp;- (u&amp;gt;&amp;gt;1) - (u&amp;gt;&amp;gt;2) is a&lt;SUB&gt;2&lt;/SUB&gt;+&lt;SUB&gt;&lt;SUP&gt;a1&lt;/SUP&gt;&lt;/SUB&gt;+&lt;SUB&gt;&lt;SUP&gt;a0&lt;/SUP&gt;&lt;/SUB&gt; which is the sum of bits in each block of 3 bits.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;The nexe step is to grab all these and sum them up:&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;((uCount + (uCount &amp;gt;&amp;gt; 3)) will re-arrange them in blocks of 6 bits and sum them up in such a way the every other block of 3 has the sum of number of set bits in the original number plus the preceding block of 3. The only expection here is the first block of 3.&amp;nbsp; The idea is not to spill over the bits to adjacent blocks while summing them up. How is that made possible. Well, the maximum number of set bits in a block of 3 is 3, in a block of 6 is 6. and 3 bits can represent upto 7. This way you make sure you dont spill the bits over. To mask out the junk while doing a uCount&amp;gt;&amp;gt;3. Do and AND with&amp;nbsp; 030707070707. THe only expection is the first block as I just mentioned.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;What does ((uCount + (uCount &amp;gt;&amp;gt; 3)) &amp;amp; 030707070707) hold now?&lt;BR&gt;Its 2^0 * (2^6 - 1) * sum0 +&amp;nbsp; 2^1 * (2^6 - 1) * sum1 + 2^2 * (2^6 - 1) * sum2&amp;nbsp; + 2^3 * (2^6 - 1) * sum3 + 2^4 * (2^6 - 1) * sum4 + 2^5 * (2^3 - 1) * sum5 &lt;BR&gt;where sum0 is the sum of number of set bits in every block of 6 bits starting from the 'low' position.&lt;BR&gt;What we need is sum0 + sum1 + sum2 + sum3 + sum4 + sum5;&lt;BR&gt;2^6-1 is 63. Clearly a modulo with 63 will get you what you want.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;Remember, that this works only with 32 bits numbers, For 64-bit numbers (well I will wait for comments or do this in the next post).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=415521" width="1" height="1"&gt;</content><author><name>jeuge</name><uri>http://blogs.msdn.com/members/jeuge.aspx</uri></author><category term="C++" scheme="http://blogs.msdn.com/jeuge/archive/tags/C_2B002B00_/default.aspx" /><category term="programming" scheme="http://blogs.msdn.com/jeuge/archive/tags/programming/default.aspx" /><category term="Algorithms" scheme="http://blogs.msdn.com/jeuge/archive/tags/Algorithms/default.aspx" /></entry><entry><title>Bit Fiddling - 2</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/archive/2005/05/02/414171.aspx" /><id>http://blogs.msdn.com/jeuge/archive/2005/05/02/414171.aspx</id><published>2005-05-03T08:57:00Z</published><updated>2005-05-03T08:57:00Z</updated><content type="html">&lt;P class=MsoNormal align=center&gt;&lt;B&gt;&lt;SPAN&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;In the &lt;a href="https://blogs.msdn.com:443/jeuge/archive/2005/04/29/Bits_and_Pieces.aspx"&gt;previous post&lt;/A&gt;&amp;nbsp;we dicussed about some trivial straightforward ways of counting set bits. Here we will discuss some fast ways of doing this.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;STRONG&gt;&lt;SPAN&gt;4.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;U&gt;Pre-Computing Bits:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;U&gt;&lt;o:p&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;The fastest ways to solve this problem is through look-up tables. But, like everything else, it comes with a cost. Here, you pay for memory.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;static unsigned int NumBits8Bit[256] ;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;//Precompute this array of size 256, each element in the array denoting the number of bits in a char (0x00 to 0xff). Then separate divide the number of interest into 4 blocks of 8 bits each by masking the last 8 bits (ANDing it with 0xffU) and right shifting by 8 bits each time. Sum up the count and return&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;int BitCount (unsigned int u)&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;{&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return NumBits8Bit [u &amp;amp; 0xffU]&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;+&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;NumBits8Bit [(u&amp;gt;&amp;gt; 8) &amp;amp; 0xffU]&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;+&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;NumBits8Bit [(u&amp;gt;&amp;gt;16) &amp;amp; 0xffU]&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;+&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;NumBits8Bit [(u&amp;gt;&amp;gt;24) &amp;amp; 0xffU] ;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;}&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;You can write several variations to this algorithm, basically changing the amount of bits you want to pre-compute. But, remember that the more bits you pre-compute, the lesser the number of look-ups. In most common cases you can precompute 4,8,16 bits. Doing a 32-bit lookup will take up quite some memory.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;In the next post we will look into some parallel counting, constant time without memory and then we will also look into some system defined functionalilty to do this.&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&lt;/o:p&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=414171" width="1" height="1"&gt;</content><author><name>jeuge</name><uri>http://blogs.msdn.com/members/jeuge.aspx</uri></author></entry><entry><title>Bit Fiddling - 1</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/archive/2005/04/29/Bits-and-Pieces.aspx" /><id>http://blogs.msdn.com/jeuge/archive/2005/04/29/Bits-and-Pieces.aspx</id><published>2005-04-30T08:31:00Z</published><updated>2005-04-30T08:31:00Z</updated><content type="html">&lt;P class=MsoNormal&gt;&lt;o:p&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&amp;nbsp;Bits and Pieces&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Over the years, I have come across interesting approaches and problems involving bit manipulations. Over this series, I will post a wide range of related solutions and algorithms.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;B&gt;&lt;U&gt;Counting Number of Set Bits&lt;o:p&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/B&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;1.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;U&gt;The Trivial Straightforward approach&lt;o:p&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;U&gt;&lt;o:p&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;In this approach, the number is looped through all its bits one by one using a right shift, and checking if the low bit is set, in every iteration by AND’ing with 0x1u&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;int BitCount(unsigned int u)&lt;/P&gt;
&lt;P class=MsoNormal&gt;{&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;unsigned int uCount = 0;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;for(; u; u&amp;gt;&amp;gt;=1)&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;uCount += u &amp;amp; 0x1u;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return uCount;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;}&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;This algorithm will iterate through every bit, until there are not more set bits. &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;Worst case performance occurs when the high bits is set.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;2.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;U&gt;Set Bit Iterator&lt;o:p&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Here, the line u &amp;amp;= u-1 flips the highest set bit in each iteration, until there are no more set bits.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;int BitCount (unsigned int u)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;{&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;unsigned int uCount=0 ;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;for(; u; u&amp;amp;=(u-1))&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uCount++;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return uCount ;&lt;/P&gt;
&lt;P class=MsoNormal&gt;}&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Running time is proportional &lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;to the number set bits, Useful when there are less number of set bits in the number&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;3.&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;U&gt;UnSet Bit Iterator&lt;o:p&gt;&lt;/o:p&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;This is similar to the above method, expect that all bits are toggled before iteration, and uCount is decremented whenever a set bit (originally unset) is encountered.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;int BitCount (unsigned int u)&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;{&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;unsigned int uCount= 8 * sizeof(unsigned int); //number of bits in unsigned int&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;u ~= (unsigned int) -1 ; // Toggle bits&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;for(; u; u&amp;amp;=(u-1))&lt;/P&gt;
&lt;P class=MsoNormal&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; uCount--;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;return uCount ;&lt;/P&gt;
&lt;P class=MsoNormal&gt;}&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;Running time is proportional to the number set bits, Useful when there are less number of unset bits in the number&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;SPAN&gt;In the next post we will discuss, fastest ways to solve this problem, and after that we will look into some tricky, nifty and brilliant solutions some of which are constant time, the ones &lt;a href="http://blogs.msdn.com/larryosterman/"&gt;Larry&lt;/A&gt; was referring&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=413629" width="1" height="1"&gt;</content><author><name>jeuge</name><uri>http://blogs.msdn.com/members/jeuge.aspx</uri></author><category term="C++" scheme="http://blogs.msdn.com/jeuge/archive/tags/C_2B002B00_/default.aspx" /><category term="programming" scheme="http://blogs.msdn.com/jeuge/archive/tags/programming/default.aspx" /><category term="Algorithms" scheme="http://blogs.msdn.com/jeuge/archive/tags/Algorithms/default.aspx" /></entry><entry><title>Digital Imaging Basics</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/jeuge/archive/2005/04/20/Color-Spaces.aspx" /><id>http://blogs.msdn.com/jeuge/archive/2005/04/20/Color-Spaces.aspx</id><published>2005-04-20T09:03:00Z</published><updated>2005-04-20T09:03:00Z</updated><content type="html">&lt;H2&gt;&lt;A name=_color_color_spaces&gt;&lt;/A&gt;Color Spaces&lt;/H2&gt;
&lt;P&gt;The human eye is often able to detect many more colors than digital devices can reproduce. For instance, if you look at a blank, white page of paper, your eye is probably detecting at least 100 distinct shades of white. A white wall can easily have 1500 shades of white.&lt;/P&gt;
&lt;P&gt;High-quality digital cameras, scanners, and other image acquisition devices can also detect hundreds of thousands or even millions of colors. Because of the presence of so many detectable colors, imaging professionals have invented models for specifying colors. These models are called &lt;I&gt;color spaces&lt;/I&gt;. &lt;/P&gt;
&lt;P&gt;The reason these models are referred to as color spaces is that most of them can be mapped into a 2-D, 3-D, or 4-D coordinate system similar to a Cartesian coordinate system. Hence colors can be said to be composed of coordinates in a 2-D, 3-D, or 4-D space. The color components in a color space are also referred to as &lt;I&gt;color channels&lt;/I&gt;.&lt;/P&gt;
&lt;P&gt;Some color spaces are intended to be independent of any device that is used to produce color images. Some are very device dependent. Both device-dependent and device-independent color spaces are discussed in the following sections:- &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_38kz.asp"&gt;RGB Color Spaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_9m43.asp"&gt;HSV Color Spaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_6yib.asp"&gt;HLS Color Spaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_420j.asp"&gt;CMY and CMYK Color Spaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_0ppv.asp"&gt;Device-Dependent Color Spaces&lt;/A&gt; 
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/library/en-us/icm/icm_2oc3.asp"&gt;Device-Independent Color Spaces&lt;/A&gt; &lt;/LI&gt;&lt;/UL&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=409913" width="1" height="1"&gt;</content><author><name>jeuge</name><uri>http://blogs.msdn.com/members/jeuge.aspx</uri></author><category term="digital imaging" scheme="http://blogs.msdn.com/jeuge/archive/tags/digital+imaging/default.aspx" /></entry></feed>