8

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

4

2 回答 2

12

如果您真的只使用 26 位,您可以使用一个整数(32 位)来表示位集,并使用按位与(&) 运算符来获得两个集的交集

如果a & b == a,ab

于 2012-09-11T07:16:37.903 回答
0

如果您要使用BitSet而不是byte,则可以使用andorxor运算符。

BitSetshift有各种位操作,不幸的是,除了。

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;
于 2012-09-11T07:15:38.413 回答