位字符串:检查一个位串是否是另一个位的子集

时间:2012-09-11 07:13:48

标签: java algorithm bytearray byte

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

2 个答案:

答案 0 :(得分:12)

如果您确实只使用了26位,则可以使用整数(32位)来表示位集,并使用bitwise AND(&)运算符来获取intersection两套。

如果a & b == a,则ab

的子集

答案 1 :(得分: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;