疑惑

P2704 [NOI2001] 炮兵阵地

羽儇 @ 2019-10-17 06:59:57

for(int i = 0 ;i < N ; i++)
    {
        for(int j = 1 ;j <= M ; j++)
        cin>>ch,a[i] = a[i] << 1 + (ch == 'H' ? 1 : 0 );
    }
for(int i = 0 ;i < N ; i++)
    {
        for(int j = 1 ;j <= M ; j++)
        cin>>ch,a[i] = a[i] << 1, a[i]+= (ch == 'H' ? 1 : 0 );
    }

有何区别呢,第一个输入代码,样例输出7(WA)

而第二个样例输出6(AC)


by caidzh @ 2019-10-17 07:15:19

@羽儇 位运算优先级玄学,建议要加括号的时候加括号


by caidzh @ 2019-10-17 07:16:12

a[i] = a[i] << 1 + (ch == 'H' ? 1 : 0 )

这里是因为后面的加法先算了


by 羽儇 @ 2019-10-17 07:41:11

@土田共戈 嗯嗯


by Inkyo @ 2019-10-17 07:42:04

同上。

位运算优先级低于加号。

来自一位写线段树把 p<<1|1写成p<<1+1然后调了半天代码的蒟蒻的怒吼


by Zhou_JK @ 2019-10-17 08:10:05

@土田共戈 Orz位运算神仙


by 1saunoya @ 2019-10-17 08:23:03

@羽儇 您好 您第一个式子是

x = x<<(……)

第二个是

x=(x<<1)+……


by 羽儇 @ 2019-10-17 08:35:18

当时没有考虑到<<会把后面的+记进去的情况,此贴终结


by 羽儇 @ 2019-10-17 08:53:24

+改成|即可

for(int i = 0 ;i < N ; i++)
    {
        for(int j = 1 ;j <= M ; j++)
        cin>>ch,a[i] = a[i] << 1 | (ch == 'H' ? 1 : 0 );
    }

by caidzh @ 2019-10-17 12:02:01

@Zhou_JK ???


|