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

sum of XOR on all combinations of values of two subsets

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

例如, if 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 个和 n-x 个零,并且 b 包含 y 个和 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) );
}