atcoder beginner contest 249 c题的官方题解,其中出现了(i>>j)&1,不是很理解这个是什么意思。
题解代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
vector<string> s(n);
for(int i=0;i<n;i++) cin>>s[i];
int ans=0;
for(int i=0;i<(1<<n);i++){
vector<int> sum(26);
for(int j=0;j<n;j++){
if((i>>j)&1){
for(int x=0;x<s[j].size();x++) sum[s[j][x]-'a']++;
}
}
int now=0;
for(int j=0;j<26;j++) if(sum[j]==k) now++;
ans=max(ans,now);
}
cout<<ans<<endl;
}
题目链接:
https://atcoder.jp/contests/abc249/tasks/abc249_c
题解链接:
https://atcoder.jp/contests/abc249/editorial/3882
>>
右移运算符
假设 i=2
,j=1
i
的值 i
的二进制形式 i >> 1
(即i的二进制形式右移1位)2
是 0010
右移一位是 0001
&
按位相与运算符二进位
进行“与”运算。如果两个相应的 二进位
都为 1
,则该位的结果值为 1
,否则为 0
。0&0=0
;0&1=0
;1&0=0
;1&1=1
引用①的 i>>1
的结果
表达式 (i>>1)&1
i>>1
00011
0001
结果 0001
即结果为 1(运算逻辑请参考②)
希望对你有帮助
补充说明:
(i>>j)
等价于 i / pow(2, j)
, 即 i
除以 2
的 j
次方
对于 &
,有两个二进制数
a=00000011,b=00000010;
a&b=00000010
各个位进行比较都为1的结果为1;否则为0;
i 除以2的j次方后的值取最低的bit位.其实就是取的i值的某个bit位上的值