x=x&(x-1) 可以将x最后一位的1消除。例如:11111&11110结果为11110,11110&11101结果为11100,11100&11011结果为11000…这样就可以知道一个数二进制有多少个1。
int solve(int x)
{
int sum = 0;
while(x)
{
x = x&(x-1);
sum++;
}
return sum;//返回的sum就是1的个数
}
例题
链接: link.
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int num[N];
int solve(int x)
{
int sum = 0;
while(x)
{
x = x&(x-1);
sum++;
}
return sum;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>num[i];
sort(num,num+n);
int Max = 0;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
int ans = solve(num[i]^num[j]);
Max = max(Max,ans);
}
}
cout<<Max<<endl;
}
return 0;
}
解决了如何求一个数的二进制有多少个一,这道例题就很好解决了。