求一个整数的2进制表示中1的个数。
一道编程题目,如下,
int calc( int i )
{
int count = 0;
while( i )
{
i &= i-1;
count++
}
cout << count;
}
想请问下 i &= i-1; 意义是什么,在数学上有什么特别的?
[解决办法]
二进制的与
i &= i-1
将 i的最后为1的那一位变成0
循环一下就得到了1的个数
你可以写一个二进制串比比看
[解决办法]
你每做一次 i &= i-1; i的二进制表示中的最后一个1就变成0了,其他的位没动
做了几步就是有多少个1
[解决办法]
这个的理解要结合图看就直观了,减去1以后就可以把最后的1处理掉,比如
10001100
-1
10001011
看到了吗,这时候,把最后的几个 0 变成了1,最后一个 1 变成了0,接着 & 与操作一下,那么到刚才的最后一个1那里,全变成了0
10001000
同时你会发现这种方法跳过了0,只处理了1,所以效率很高