了解按位条件检查以获取传递的数组中所有可能的组合总和

时间:2013-01-14 06:44:09

标签: java bit-manipulation bitwise-operators bit-shift bitwise-and

我得到了一个算法,其目的是给出整数数组中所有组合的所有可能总和。

private void arraySumPermutation(int value ,int[] arr){
    int N = arr.length;     
    for(int i=0;i<1<<N;i++){
        int sum = 0;                
        for(int j=0;j<N;j++){       

            if((i & 1<<j)>0){
                iCount++;
                sum += arr[j];  
                //S.O.P(sum);
            }
        }

    }
}

我无法理解按位AND添加的内部if条件。 内部if循环的目标是什么。

if((i & 1<<j)>0)

1 个答案:

答案 0 :(得分:3)

让我们将N元素集的组合表示为N位数,其中如果j项包含在组合中,则j位为1,否则为0。这样,您可以将所有可能的组合表示为范围[0,2 N )中的数字。

外部循环迭代这些数字(1 << N == 2 N )。

内部循环遍历集合的项目并if条件检查j项是否包含在当前组合中。换句话说,它会检查j的{​​{1}}是否为1。

i为您提供一个数字,其中1<<j位为1,j重置除该位以外的i & (1 << j)的所有位,并i检查结果不是0。

请注意,此代码(> s)仅适用于N&lt; 31。