内容会持续更新,有错误的地方欢迎指正,谢谢!
告诉大家一个诀窍,能高效解决大多数二进制的题目。
假设有一个数n,那么n&(n-1)
的作用: n&(n-1)
得到的结果相当于把整数的二进制表示中最右边的那个1变成0。
例1:求二进制数中1的个数。输入一个整数,输出该数二进制表示中1的个数,其中负数是用的补码表示。
class Solution
{
public:
int NumOf1(int n)
{
int count=0;
while(n!=0)
{
n&=(n-1);
++count;
}
return count;
}
};
例2:求两个整数m和n的二进制有多少位不同
class Solution
{
public:
int NumOfDiff(int m,int n)
{
int res=m^n;//先异或得到res,即求res的二进制中有多少1
int count=0;
while(res!=0)//res为0,则表示 已无 不同位
{
res&=(res-1);
++count;
}
return count;
}
};
总结:很多二进制的问题都可以用上述这种思路来解决。
另外,这种思路还有一个用处,比如求11%8的时候,可以用11&(8-1)
即11&7
来替代求余以节约性能。使用该方法的前提:“%”的右边这个数必须是2的幂,“%”的左边这个数没限制。