求二进制中1的个数
题目
求一个二进制数字中1出现的个数
这道题目面试非常常见,但是工作中也很实用,以32位int整形为例,下面列举一下一些经典的做法(主要是做记录用^_^)
遍历法
这个是最简单的方法,向右移位,判断最低位是否为1进行计数即可!
1 | /** |
该方法最直观,不过复杂度是O(N)
快速查找法
为啥说快速呢,因为这里的复杂度是和1个个数有关,有多少1就循环多少次,该方法的设计也非常巧妙
1 | /** |
大致可以这么理解
假设当前的n=7
n n-1
0111 0110
0110 0101
0100 0011
复杂度是O(K)
,其中K
为二进制数中1个数,非常实用
查表法
一般整形的位数是固定的,假如我们知道每种情况下的1的个数,其实直接查表即可,但是如果是32位的整形枚举这个表的可能性不是很大,但是巧妙的方法是可以将其分割成4个8位的数字,而8位的数字就只有256种情况了,可以直接方法预设的表中
1 | /** |
该方法的复杂度是O(N/8)
,占的空间也不是特别多,也是比较实用的一种
还有一些神奇的方法可以看http://www.cnblogs.com/graphics/archive/2010/06/21/1752421.html,写得非常赞
本作品采用[知识共享署名-非商业性使用-相同方式共享 2.5]中国大陆许可协议进行许可,我的博客欢迎复制共享,但在同时,希望保留我的署名权kubiCode,并且,不得用于商业用途。如您有任何疑问或者授权方面的协商,请给我留言。