这个代码完全不理解 想知道是什么意思

链接:https://ac.nowcoder.com/acm/contest/23479/K
来源:牛客
小红拿到了一个正整数 xx 。她想构造一个正整数 yy,满足以下性质:

  1. yy 是 xx 的倍数,且 xx 和 yy 不能相等。
  2. xx 在二进制表示下(为一个01串)是 yy 的二进制表示的一个子串。且 xx 和 yy 的二进制表示的1的个数不能相同。
  3. yy 必须为不超过 10^{19}10
    19
    的正整数。
    举个例子:
    若 x=5x=5 :
    那么构造的 yy 不能是5,因为这样 yy 和 xx 相等,所以非法。
    也不能是 6,因为这样 yy 不是 xx 的倍数,所以非法。
    也不能是 10 ,因为这样 yy 的二进制表示是 1010、xx 的二进制表示是101,虽然 yy 是 xx 的倍数且 xx 的二进制是 yy 的一个子串,但它们的 '1' 的个数相同,所以非法。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
    ll x;
    cin>>x;
    ll t=x;
    ll b=1;
    while(x)
    {
        x>>=1;
        b*=2;
    }
    cout<<t+t*b;
    return 0;
}

假设x=5,那么x的二进制为0101,x>>1表示x右移1位,即把最右边一位的1删掉,变为010,此时x=2;b2=2
第二轮x>>1变为01 x=1 b=4
第三轮x>>1变为0 x=0 b=8
跳出循环
t+t
b=5+5*8=45 二进制位101101
45是5的倍数,101是101101子串且1的个数不相等。

你哪里不明白?

ll是long long 开始用键盘输入,赋值给x
通过while循环,b进行倍乘,
最后t+t*b输出

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632