将String转换为位数组

时间:2014-10-02 01:28:15

标签: java arrays java-8

我想将包含0' s和1' s的字符串转换为位数组。
字符串的长度约为30000,并且稀疏(大多数是0,很少1) 例如,给定一个字符串
" 00000000100000000010000100000000001000"
我想把它转换成一个存储
位的数组 [00000000100000000010000100000000001000]

我正在考虑使用BitSetOpenBitSet 有没有更好的办法?用例是有效地执行逻辑OR。

我正在考虑这些方面

final OpenBitSet logicalOrResult = new OpenBitSet(); 
for (final String line : lines) {

   final OpenBitSet myBitArray = new OpenBitSet(); 
   int pos = 0;
   for (final char c : str.toCharArray()) {
         myBitArray.set(pos) = c;
         pos++;
   }
   logicalOrResult.or(myBitArray);
}

3 个答案:

答案 0 :(得分:2)

BigInteger可以解析并存储它,并执行按位操作:

BigInteger x = new BigInteger(bitString, 2);
BigInteger y = new BigInteger(otherBitString, 2);
x = x.or(y);
System.out.println(x.toString(2));

答案 1 :(得分:1)

BitSet范围超过030000之间的值需要long大小小于500的数组,因此您可以假设BitSet.or(或尽管稀疏性,相应的OpenBitSet方法)将足够快。看起来OpenBitSet的性能优于BitSet,但除此之外,您使用哪个并不重要,两者都会有效地实现or。但是,确保将String的长度传递给(Open)BitSet构造函数,以避免在构造期间重新分配内部long数组!

如果您的字符串更长并且您的稀疏性极端,您还可以考虑将它们存储为Integer s(或int s的排序列表,如果您使用像Trove这样的库),表示包含1的索引。按位or可以以类似合并(排序)的方式实现,这非常有效(时间O(n + m),其中n,m是每个字符串中的1的数量)。我怀疑在你的场景中它会慢于BitSet方法。

答案 2 :(得分:0)

您可以遍历每个角色:

boolean[] bits = new boolean[str.length];

for (int i=0;i<str.length;i++) {
    if (str.charAt(i).equals("1")
        bits[i] = true;
    else if (str.charAt(i).equals("0")
        bits[i] = false;
}

如果您希望提高内存效率,可以试试RLE (Run Length Encoding)

相关问题