Java N位集之间的异或

Java N位集之间的异或,java,string,bit-manipulation,bitset,Java,String,Bit Manipulation,Bitset,我正在使用位集用Java实现一个程序,我陷入了以下操作: 给定N个位集,如果所有位集中有多个位集,则返回一个包含0的位集,否则返回1 例如,假设我们有3套: 10010 01011 00111 11100预期结果 对于以下几组: 10010 01011 00111 10100 00101 01000预期结果 我试图用逐位运算来实现这个互斥运算,我已经意识到我需要的是所有集合之间的互斥或,但不是以迭代的方式, 所以我很困惑该怎么办。这可能吗 我想避免昂贵的解决方案,即必须检查每个集合中的每

我正在使用位集用Java实现一个程序,我陷入了以下操作:

给定N个位集,如果所有位集中有多个位集,则返回一个包含0的位集,否则返回1

例如,假设我们有3套:

  • 10010
  • 01011
  • 00111

  • 11100预期结果

对于以下几组:

  • 10010
  • 01011
  • 00111
  • 10100
  • 00101

  • 01000预期结果

我试图用逐位运算来实现这个互斥运算,我已经意识到我需要的是所有集合之间的互斥或,但不是以迭代的方式, 所以我很困惑该怎么办。这可能吗

我想避免昂贵的解决方案,即必须检查每个集合中的每个位,并为每个位置保留一个计数器

谢谢你的帮助


编辑:正如一些人所问,这是我正在进行的一个项目的一部分。我正在构建一个时间表生成器,基本上一个软约束是,任何学生在一天中都不应该只有一节课,因此这些集合代表每小时的在校学生,我想筛选只有一节课的学生

首先,如果不检查每个集合中的每一位,就无法执行此操作。如果您可以在不检查任意位的情况下解决此问题,则这意味着存在两种解决方案(即,该位可以是的两个值中的每一个都有两种不同的解决方案)


如果你想更有效地计算多个位集的异或,我会考虑把你的集合表示成整数,而不是用一组单独的比特来表示。然后简单地对整数进行异或运算,得到你的答案。否则,在我看来,您必须迭代每个位,检查其值,然后自己计算解决方案(如您在问题中所述)

你可以用两个值做你想做的事。一个至少设置一次位,另一个设置多次。该组合可用于确定这些设置一次,不再使用

int[] ints = {0b10010, 0b01011, 0b00111, 0b10100, 0b00101};
int setOnce = 0, setMore = 0;
for (int i : ints) {
    setMore |= setOnce & i;
    setOnce |= i;
}
int result = setOnce & ~setMore;
System.out.println(String.format("%5s", Integer.toBinaryString(result)).replace(' ', '0'));
印刷品

01000

你真正需要的不是排他性的or。如果你有三组都是1,那么它们的异或是all-1,但你应该产生all-0。我可以问一下你在这里真正的目标是什么吗?(这听起来像是家庭作业,但我希望如果你在寻求家庭作业方面的帮助,你会这么说。)我认为需要一种迭代方式=)当我阅读要求时,他想要
~setMore
,但好的解决方案,无论阅读正确与否,+1。这与文本相符,但示例表明只有一种。啊,我没有检查示例;)我不理解课文