我正在尝试迭代和位移的powerset问题 有一种我无法理解的特殊行为 我本来期望下面的所有3个语句都表示测试i中的第j位是否已设置 为什么结果不同呢?
private static void printSubsetInBit(Integer[] arr) {
for(int i=0;i<(1<<arr.length);i++){
List<Integer> pack=new ArrayList<Integer>();
for(int j=0;j<arr.length;j++){
//if(((i>>j)&1)==1){ -->>>> WORKS
//if((i & ( 1<<j))>0){-->>>> WORKS
if((i & ( 1<<j))==1){ -->>>> DOES NOT WORK
pack.add(arr[j]);
}
}
System.out.println(pack.toString());
}
}
答案 0 :(得分:2)
如果你左移1乘以j然后用它来掩饰i,你必须将结果与j左移1的结果进行比较,而不是1。
换句话说,条件应该是
((i & (1 << j)) == (1 << j))
或者只是&#34;!= 0&#34;会好的。
答案 1 :(得分:0)
(i & ( 1<<j))==1
,否则 j == 0
为false,因为((1<<j) & 1 == 0) == (j != 0)
(*)。
这与其他表达式完全不同。
(*)好吧,j % 32 == 0
/ j % 32 != 0
;第二个操作数被屏蔽。