【问题标题】:Bit Strings: checking if one bitstring is a subset of another位串:检查一个位串是否是另一个位串的子集
【发布时间】:2012-09-04 01:54:54
【问题描述】:

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

【问题讨论】:

  • 这是如何存储的,作为 String 或作为占据前 26 位的整数值 (Integer)?如果是后者,简单的按位运算应该可以解决问题,否则会更复杂..

标签: java algorithm bytearray byte


【解决方案1】:

如果你真的只使用26位,你可以使用一个整数(32位)来表示bitset,并使用bitwise AND(&)运算符,得到这两个集合的intersection

如果a & b == aab 的子集

【讨论】:

    【解决方案2】:

    如果您要使用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;
    

    【讨论】:

    • 这会检查相等性,而不是子集!
    • 对于子集使用a and b = a,对于相等使用a xor b = 0
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2022-07-01
    • 2013-05-12
    相关资源
    最近更新 更多