刷题中学习到了Brian Kernighan算法,为前人的智慧所折服?
什么是Brian Keringhan算法呢?
简单来说就是一个式子:
x=x&(x-1);
式子的意思为把最后一个二进制的1变为0。
当x不为0时,不断执行这个式子,记录这个式子的执行次数就可以获得二进制数有几个1了。
说起来很难理解?让我们来简单推导一下就是啦。
以数字7为例。
7转换成二进制就是111=4+2+1;
那么x-1就是6,即为110
对111和110进行按位与运算(tips:&是按位与运算,即都为1时才取1,其余全部变为0);
就会按位与&运算成为110
然后再次按位与&运算110和101(110-1),变为100。
最后进行一次按位与&运算100和11(100-1)变为0。
推导的过程中我们可以很清晰的发现每进行一次x=x&(x-1)操作就会有一个1变为0。