Counting Bits

Preview:

DESCRIPTION

This ppt describes one of the interesting algorithms to count the number of bits set in an unsigned integer. x = (x & 0x55555555) + ((x>>1)&0x55555555)); x = (x&0x33333333) + ((x>>2)&0x33333333); ... ....

Citation preview

www.gowrikumar.comwww.gowrikumar.com

Counting the number of Counting the number of bits setbits set

CH Gowri KumarCH Gowri Kumar

gkumar007@gmail.comgkumar007@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

Recommended