Algorithm 两个子集所有值组合的XOR之和

Algorithm 两个子集所有值组合的XOR之和,algorithm,xor,Algorithm,Xor,假设我有两个整数数组a和b,每个数组有n个整数。 我想知道两个不同子集中两个整数的所有组合的xor之和 比如说,, 如果n==3: 我想知道: a1^b1 + a1^b2 + a1^b3 + a2^b1 + a2^b2 + a2^b3 + a3^b1 + a3^b2 + a3^b3 有没有一种方法可以像+和x一样有效地实现这一点 i.e. 1*2 + 1*3 + 2*2 + 2*3 = (1+2)*(2+3) 如果数组中只有一个非零值,则有一个公式有效。因此,您可以一次执行一个位值,然后将每

假设我有两个整数数组a和b,每个数组有n个整数。 我想知道两个不同子集中两个整数的所有组合的xor之和

比如说,,
如果n==3
: 我想知道:

a1^b1 + a1^b2 + a1^b3 + a2^b1 + a2^b2 + a2^b3 + a3^b1 + a3^b2 + a3^b3
有没有一种方法可以像+和x一样有效地实现这一点

i.e. 1*2 + 1*3 + 2*2 + 2*3 = (1+2)*(2+3)

如果数组中只有一个非零值,则有一个公式有效。因此,您可以一次执行一个位值,然后将每个位值的结果相加

如果您知道a包含x个1和n-x个零,b包含y个1和n-y个零,那么每个a^b都是1或0,1的数目正好是x*(n-y)+y*(n-x)

如果在子集中隔离1位,则可以计算XOR对中设置了多少1位。类似地,如果隔离2位,则可以计算在异或对中设置了多少2位。将每个位值的结果相加,得出最终答案:

int total = 0;
for (int bit=1; bit>0 && (bit  < a.length || bit < b.length); bit<<=1) {
    int acount = 0;
    for (int val : a) {
        acount += val & bit;
    }
    acount /= bit;
    int bcount = 0;
    for (int val: b) {
        bcount += val & bit;
    }
    bcount /= bit;
    total += bit * ( acount * (b.length-bcount) + bcount * (a.length-acount) );
}
int-total=0;

对于(int bit=1;bit>0&(bit 如果您知道a包含x个1和n-x个零,b包含y个1和n-y个零,那么每个a^b都是1或0,1的数目正好是x*(n-y)+y*(n-x)

如果在子集中隔离1位,则可以计算在异或对中设置了多少1位。类似地,如果隔离2位,则可以计算在异或对中设置了多少2位。将每个位值的结果相加,得出最终答案:

int total = 0;
for (int bit=1; bit>0 && (bit  < a.length || bit < b.length); bit<<=1) {
    int acount = 0;
    for (int val : a) {
        acount += val & bit;
    }
    acount /= bit;
    int bcount = 0;
    for (int val: b) {
        bcount += val & bit;
    }
    bcount /= bit;
    total += bit * ( acount * (b.length-bcount) + bcount * (a.length-acount) );
}
int-total=0;
对于(int bit=1;bit>0&(bit