ご覧のとおり、中間結果を格納するために単一のセットを使用してそれを行うことはできません。これは、ビットごとに 3 つの状態 (決してセットしない、一度セットする、複数回セットする) を区別する必要があるためです。
したがって、少なくとも 2 つの中間結果が必要です。たとえば、少なくとも 1 回設定されたビットと複数回設定されたビットを別々に追跡できます。
int atLeastOnce = 0;
int moreThanOnce = 0;
for (int current: sets) {
moreThanOnce |= (atLeastOnce & current);
atLeastOnce |= current;
}
int justOnce = atLeastOnce & ~moreThanOnce;
または s を使用します (は不変ではないBitSet
ため、それほどエレガントではありません):BitSet
BitSet atLeastOnce = new BitSet();
BitSet moreThanOnce = new BitSet();
for (BitSet current: sets) {
BitSet moreThanOnceInCurrent = (BitSet) atLeastOnce.clone();
moreThanOnceInCurrent.and(current);
moreThanOnce.or(moreThanOnceInCurrent);
atLeastOnce.or(current);
}
atLeastOnce.andNot(moreThanOnce);
BitSet justOnce = atLeastOnce;