www.gowrikumar.comwww.gowrikumar.com
Counting the number of Counting the number of bits setbits set
CH Gowri KumarCH Gowri Kumar
[email protected]@gmail.com
www.gowrikumar.comwww.gowrikumar.com
Copyright NoticeCopyright Notice
© 2008, © 2008, www.gowrikumar.comwww.gowrikumar.com
You are given unrestricted freedom to You are given unrestricted freedom to
use, modify, copy and redistribute in use, modify, copy and redistribute in
any format/mediaany format/media, as long as you retain , as long as you retain
this copyright statement.this copyright statement.
www.gowrikumar.comwww.gowrikumar.com
Problem StatementProblem Statement
Given an unsigned integer n, count the Given an unsigned integer n, count the number of bits set in it.number of bits set in it.
Ex :Ex : 3 3 11 11 2 2 8 8 1000 1000 1 1 2323101111011144
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
1 0 0 1 0 0 0 0 1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
1 0 0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
1 0 0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 1 0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 0 0 1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
0 0 1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
1 1 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1
1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
1 1 0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 0 0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
0 1
+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
0 1 1 0 0 1 0 0 0 0 1 1 0 0 0 1
+ + + + + + + +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
C codeC code
x = (x & 0x5555) + ((x>>1) & 0x5555)x = (x & 0x5555) + ((x>>1) & 0x5555)
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 1 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 0 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 0 1 0
0 1 0 0 0 0 1 0 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 0 1 0
0 1 0 0 0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 0 0 10 0 1 0
0 1 0 0 0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 0 0 10 0 1 0
0 0 1 0 0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 0 0 10 0 1 0
0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
0 0 1 0 0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
0 0 0 1
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
0 0 0 1+
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 10 1 0 00 0 1 0
0 1 0 1 0 1 0 0 0 0 1 0 0 0 0 1+ + + +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0
www.gowrikumar.comwww.gowrikumar.com
C codeC code
x = (x & 0x5555) + ((x>>1) & 0x5555)x = (x & 0x5555) + ((x>>1) & 0x5555)
x = (x & 0x3333) + ((x>>2) & 0x3333)x = (x & 0x3333) + ((x>>2) & 0x3333)
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0 +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0 +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 0 10 0 1 1
0 0 0 10 0 1 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 0 10 0 1 1
0 0 0 10 0 1 0 +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 1 10 0 0 0
0 0 0 10 0 1 0 +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 1 10 0 0 0
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 0 10 0 1 1
0 0 0 10 0 1 00 0 0 10 0 1 0 + +
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 1 10 0 0 0
www.gowrikumar.comwww.gowrikumar.com
C codeC code
x = (x & 0x5555) + ((x>>1) & 0x5555)x = (x & 0x5555) + ((x>>1) & 0x5555)
x = (x & 0x3333) + ((x>>2) & 0x3333)x = (x & 0x3333) + ((x>>2) & 0x3333)
x = (x & 0x0F0F) + ((x>>4) & 0x0F0F)x = (x & 0x0F0F) + ((x>>4) & 0x0F0F)
www.gowrikumar.comwww.gowrikumar.com
0 1 0 00 1 1 0 0 0 0 10 0 1 1
0 0 1 10 0 0 0 0 0 1 10 0 0 0+
www.gowrikumar.comwww.gowrikumar.com
0 0 0 00 0 0 0 0 1 1 00 0 0 0
0 0 1 10 0 0 0 0 0 1 10 0 0 0+
www.gowrikumar.comwww.gowrikumar.com
0 0 0 00 0 0 0 0 1 1 00 0 0 0
www.gowrikumar.comwww.gowrikumar.com
C codeC code
x = (x & 0x5555) + ((x>>1) & 0x5555)x = (x & 0x5555) + ((x>>1) & 0x5555)
x = (x & 0x3333) + ((x>>2) & 0x3333)x = (x & 0x3333) + ((x>>2) & 0x3333)
x = (x & 0x0F0F) + ((x>>4) & 0x0F0F)x = (x & 0x0F0F) + ((x>>4) & 0x0F0F)
x = (x & 0x00FF) + (x>>16) & 0x00FF)x = (x & 0x00FF) + (x>>16) & 0x00FF)
www.gowrikumar.comwww.gowrikumar.com
Code for 32-bit integersCode for 32-bit integers
x = (x&0x55555555) + ((x>>1)&0x55555555)x = (x&0x55555555) + ((x>>1)&0x55555555)
x = (x&0x33333333) + ((x>>2)&0x33333333)x = (x&0x33333333) + ((x>>2)&0x33333333)
x = (x&0x0F0F0F0F) + ((x>>4)&0x0F0F0F0F)x = (x&0x0F0F0F0F) + ((x>>4)&0x0F0F0F0F)
x = (x&0x00FF00FF) + ((x>>8)&0x00FF00FF)x = (x&0x00FF00FF) + ((x>>8)&0x00FF00FF)
x = (x&0x0000FFFF) + ((x>>16)&0x0000FFFF)x = (x&0x0000FFFF) + ((x>>16)&0x0000FFFF)
return x;return x;
www.gowrikumar.comwww.gowrikumar.com
ReferenceReference
Hackers DelightHackers Delight
www.gowrikumar.comwww.gowrikumar.com
The EndThe End