本篇博客会讲解力扣“191. 位1的个数”的解题思路,这是题目链接。
要想求解二进制位中1的个数,首先要了解一个神奇的表达式:n &= n - 1
。这个表达式的含义是:把n的二进制中最低位的1变成0,也就是消除n的二进制中最低位的1。比如,当n是11时,二进制是1011,此时若执行n &= n - 1
,相当于把二进制的1011和1010进行按位与,结果的二进制是1010,相当于把原来的11的二进制1011最低位的1消除了。
既然执行n &= n - 1
就能消除n的二进制最低位的1,那我们就反复执行这个表达式,每次执行一次都消除一个1,直到n变成0为止。这样,我们就可以统计出执行了多少次,也就是一开始的n的二进制中有多少个1。所以求解一个无符号整数n的二进制中1的个数的方法就是:反复执行n &= n - 1
直到n变成0,记录执行次数,即为n的二进制中1的个数。
int hammingWeight(uint32_t n) {
int ret = 0;
while (n)
{
// 去掉最右边的1
n &= n - 1;
++ret;
}
return ret;
}
总结
用n &= n - 1
消除n的二进制最低位的1,直到n为0,即可求出n的二进制中1的个数。
感谢大家的阅读!