在http://code.google.com/codejam/contest/dashboard?c=433101#s=a&a=0的一轮“代码果酱资格赛”中,出现了一个名为“鲷鱼链”的问题。从比赛分析中,我知道问题需要花些时间来处理,例如提取整数的最右边的N位并检查它们是否全部为1。我看到了参赛者的(Eireksten)代码,执行以下操作:
(((K&(1<<N)-1))==(1<<N)-1)
我不明白这是怎么回事。比较中-1的用途是什么?如果有人可以解释这一点,那对我们的新手将很有用。同样,任何识别此类问题的技巧都将不胜感激。我用一个幼稚的算法解决了这个问题,最终只解决了较小的数据集(编译大型数据集花了一些时间,需要在8分钟内提交)。提前致谢。
让我们以N = 3为例。以二进制形式1<<3 == 0b1000。这样1<<3 - 1 == 0b111。
1<<3 == 0b1000
1<<3 - 1 == 0b111
通常,1<<N - 1以二进制形式创建带有N个数字的数字。
1<<N - 1
让R = 1<<N-1。然后,表达式变为(K&R) == R。所述K&R将提取的最后N个比特,例如:
R = 1<<N-1
(K&R) == R
K&R
101001010 & 111 ———————————— 000000010
(回想一下,当且仅当两个操作数在该数字中都为1时,按位与运算符才会在该数字中返回1。)
当且仅当最后N位全为1时,等式成立。因此,表达式检查K是否以N结尾。