我将这组英文字母表示为26位位串。第一位对应'a',设置位对应'b',依此类推。
因此,
字符串ab表示为11000000000000000000000000
现在,给定两个位串,我想检查位串1是否是位串2的子集。也就是说,在所有位置,位串1都有一个'1',位串2也应该有一个'1'。这意味着string1中的所有字符也存在于string2中。有人可以告诉我最好的方法吗?
我知道一个简单的方法如下:迭代位string1并检查位string2中的相应位。但是,我想知道是否可以以更有效的方式使用某种位运算符来完成
答案 0 :(得分:12)
如果您确实只使用了26位,则可以使用整数(32位)来表示位集,并使用bitwise AND(&)运算符来获取intersection两套。
如果a & b == a
,则a
是b
答案 1 :(得分:0)
如果您使用BitSet
代替byte
,则可以使用and
或xor
运算符。
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;