对于这个问题http://www.codechef.com/COOK49/problems/SHOOTING/。我无法解决它所以我遵循了这个解决方案http://www.codechef.com/viewsolution/4619933。你能解释一下这些步骤吗
int laserNo = lasers.size();
int upLasers = 1 << laserNo;
boolean found = false;
for (int u=0; u<upLasers; u++) {
for (int bit=0; bit<laserNo; bit++) {
if ((u&(1<<bit)) != 0) {
Point laser = lasers.get(bit);
为什么我们使用按位运算符?
答案 0 :(得分:0)
此代码使用u
表示一组整数。 u
二进制表示中的每个位都会告诉您相应的元素是否在集合中。例如,要检查3是否在集合中,检查是否“u&amp;(1 <&lt; 3)!= 0&#39; (即,如果设置了第3位)。
通过从0迭代到upLasers - 1
,它基本上遍历从0到laserNo
的所有可能的整数集。
这段代码本可以使用BitSet代替,虽然迭代会变得复杂得多(你基本上最终会模仿二进制增量)。
性能和教学价值可能是以这种方式完成的其他原因。