weixin_50947427 2022-04-29 22:34 采纳率: 66.7%
浏览 50
已结题

(i>>j)&1这个运算的意思是什么,不用位运算的话怎么写?

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

  • 写回答

2条回答 默认 最新

  • A-Chin 2022-04-29 23:36
    关注

    >> 右移运算符
    假设 i=2j=1

    1. i 的值 i 的二进制形式 i >> 1 (即i的二进制形式右移1位)
      20010 右移一位是 0001
    2. & 按位相与运算符
      参加运算的两个数据,按 二进位 进行“与”运算。如果两个相应的 二进位 都为 1,则该位的结果值为 1,否则为 0
      0&0=00&1=01&0=01&1=1

    引用①的 i>>1 的结果
    表达式 (i>>1)&1
    i>>1 0001
    1 0001
    结果 0001 即结果为 1(运算逻辑请参考②)
    希望对你有帮助


    补充说明:

    1. (i>>j) 等价于 i / pow(2, j), 即 i 除以 2j 次方

    2. 对于 &,有两个二进制数
      a=00000011,b=00000010;
      a&b=00000010
      各个位进行比较都为1的结果为1;否则为0;

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月6日
  • 创建了问题 4月29日

悬赏问题

  • ¥15 单纯型python实现编译报错
  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音