我正在使用BitSets在Java中实现一个程序,我陷入了以下操作:
如果所有BitSet中有超过1个,则N BitSet返回BitSet为0,否则返回1
举个例子,假设我们有3套:
00111
11100预期结果
对于以下几组:
00101
01000预期结果
我试图通过逐位操作来完成此操作,并且我已经意识到我需要的是字面上的所有集合或者所有集合之间,但不是以迭代方式, 所以我很不知所措。这甚至可能吗?
我想避免昂贵的解决方案,必须检查每组中的每一位,并为每个位置保留一个计数器......
感谢您的帮助
编辑:有人问,这是我正在研究的项目的一部分。我正在构建一个时间表生成器,基本上一个软约束是没有学生在1天内只有1个课程,所以这些集合代表每个小时的主要学生,我想过滤那些只有1个班级的学生。
答案 0 :(得分:4)
你可以用两个值做你想做的事。一个位设置至少一次,第二个设置不止一次。该组合可用于确定那些设置一次而不再确定。
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
答案 1 :(得分:1)
首先,如果不检查每组中的每一位,就不能这样做。如果你可以在不检查某个任意位的情况下解决这个问题,那么这意味着存在两个解决方案(即两个值中的每一个都可以有两个不同的解决方案)。
如果你想要一种更有效的方法来计算多个位集的XOR,我会考虑将你的集合表示为整数而不是单个位的集合。然后简单地将整数异或一起得到你的答案。否则,在我看来,你必须遍历每一位,检查它的值,并自己计算解决方案(如你在问题中所描述的)。