奇怪的位移行为

时间:2017-02-18 17:09:34

标签: java bit-manipulation

我正在尝试迭代和位移的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());
                }
        }

2 个答案:

答案 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;第二个操作数被屏蔽。