UOJ Logo TKD的博客

博客

关于位运算的提醒

2015-03-12 15:51:07 By TKD

额。。。今天打LCT的时候莫名其妙的RE了

很不爽,然后调代码。。。

调着调着发现一个天大的错误。。。

大概是这样的:

乃们平常都是这样写的

bool IsRoot(int x)
{
    return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
}

然后因为我欠抽想用位运算,所以。。。

bool IsRoot(int x)
{
    return (son[fa[x]][0]^x)&(son[fa[x]][1]^x);
}

然后就感觉自己很机智。。。

但一交上去,我就发现我RE了

。。。= =

直到调了几个小时之后想弃疗了

1756500824才告诉我,可能是位运算玩脱了

于是我就检查了一下

诶不对啊

比如。。。

x=1;
son[fa[x]][0]=4;
son[fa[x]][1]=11;
son[fa[x]][0]^1=5;
son[fa[x]][1]^1=10;
(son[fa[x]][0]^x)&(son[fa[x]][1]^x)=0;

FML!!!!!!!!!!!!!!!

所以其实就是我sb了

改成这样之后。。。就过了

bool IsRoot(int x)
{
    return (bool)(son[fa[x]][0]^x)&(bool)(son[fa[x]][1]^x);
}

对了乃们知道到底用位运算快还是逻辑运算符快吗???

如果这样还比原来慢一些的话

那我就真的是闷声作大死了→_→

评论

matthew99
可怕
zangfenziang
。。。
strike
好口怕
taorunz
不是有编译器优化嘛
Gromah
可怕。
PoPoQQQ
。。。。

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。