2012-09-11 129 views
6

我将一组英文字母表示为26位的位串。第一位对应于'a',将设置位设为'b',依此类推。 因此,
字符串ab被表示为11000000000000000000000000
现在,给定两个位串,我想检查位串1是否是位串2的子集。也就是说,在所有位置,位串1具有'1'位字符串2也应该有'1'。这意味着string1中的所有字符也存在于string2中。有人可以让我知道这样做的最好方法吗?
我知道一个简单的方法如下:遍历位串1并检查位串2中的相应位。不过,我想知道这是否可以使用一些逐位运营商以更有效的方式位字符串:检查一个位串是否是另一个位的子集

+0

的子集,这是如何存储,作为一个'String'或作为积分值('Integer')占据第一26个比特?如果后者,简单的按位操作应该做的伎俩,其他更复杂.. – Nim

回答

10

如果你真的只使用26位,你可以使用一个整数(32位)来表示此位集,并使用bitwise AND(&)运营商,得到两套的intersection

a & b == a如果,ab

0

如果你会使用BitSet,而不是byte,您可以使用andxor运营商来完成。

BitSet有不同的位操作,除了shift,不幸的是。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html#xor%28java.util.BitSet%29

首先设置xor秒组应该是0

既然你只使用26个字符,你可以做同样的用一个简单的int了。只设置各个位更多的是有点乱:

a |= 1 << offset; 
+0

这检查相等,而不是子集! – TimeToCodeTheRoad

+0

对于子集使用'a和b = a',等式'a xor b = 0'。 –

相关问题