多校训练7 I xay loves or 位运算

题意:题目给出x,s,要求有多少个 y 满足 x | y = s

思路:按位运算的解法,模拟y的每一位1取0或1是否可行,如果取0和1都可以,即答案 × 2,只可取0或1,答案总数不变,当出现 0 和 1 都不可取时,输出答案 = 0。

  • 注意:当给出的 x = s 时,总答案数要减1,y是正整数,所以答案要减去 y = 0的情况
    (x | 0 == x)
  • 代码中有一处需注意,当 aa = 0 && bb = 0 时候,p = 1错误,return false;
if(!aa && !bb)
    if(p == 1)   return false;

accode:

#include <bits/stdc++.h>
#define ios std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;
ll x, s, ans = 1;

bool check(int k, int p)
{
    int aa = (x>>k) & 1;
    int bb = (s>>k) & 1;
    //cout<<aa<<" "<<bb<<endl;
    if(aa && !bb)    return false;
    if(!aa && bb)
    {
        if(p == 0)   return false;
    }
    if(!aa && !bb)
    {
        if(p == 1)   return false;
    }
    return true;
}

int main()
{
    ios
    cin>>x>>s;
    bool f1, f2;
    for(int i = 0; i <= 31; i++)
    {
        f1 = check(i, 0);
        f2 = check(i, 1);
        if(f1 && f2) ans *= 2;
        if(!f1 && !f2)      return puts("0"), 0;
    }
    if(x == s)   ans--;
    cout<<ans<<endl;
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值