Brian Kernighan算法
最近看到一个题,就是算一个int里面有多少个1。这个还是挺常用的,也不难,就是判断最后一位是不是1,然后移位,很快就能给答案。
int hammingWeight(int n) {
int result = 0;
for(int i = 0; i < 31; i++)
{
if(n & 1)
result++;
n = n >> 1;
}
return result;
}
但是提交上去看到答案也不是很理想。
主要是内存用的不是很好。查一下这个,是有个Brian Kernighan算法,算法大概是这样的:
int hammingWeight(int n) {
while (n) {
n &= (n - 1);
++count;
}
}
其中关键的就是这句n &= (n - 1);
也就是n = n & (n - 1);
仔细看看这个什么意思呢,关于位操作,之前其实写过一篇。C语言位操作详解:基础原理与实际应用示例-CSDN博客
关于&,是这样的:
只有两个位都是1时,结果位才是1。
可以用来清除某一段位数据
以6为例子:
二进制是110,那么-1就是101,再&之后就是100(4)。
之后-1就是011,再&之后就是000。跳出循环。
本质就是跳过了0,每次只处理1。
再白话一点就是每次从后清掉一个1,直到清完。
相比以前要硬循环31次,确实巧妙了一些。。。
其实刚刚做的时候,就在想能不能减少循环的次数,其实如果多想几天,也许这种解法也能想到。到时候就也能青史留名啦。。。