2013-05-06 90 views
1

基于Javadoc,下面的代码应该打印6。然而,它没有明显的原因输出3Java BitSet奇怪的行为

import java.util.*; 
public class BitSetStrangeness{ 
    public static void main(String[] args){ 
     BitSet foo = new BitSet(); 
     int[] arbitrary = new int[] { 
    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 
     }; 
     for (int i = 0; i < arbitrary.length; i++) 
      if (arbitrary[i] == 1) foo.set(i); 
      else foo.clear(i); 
     System.out.println(foo.get(15,21).length()); 
    } 
} 

任何人都可以解释)为什么我看到这种行为和b)如何我可以修改代码来解决它,这样提取的比特集的长度是6,而不是3呢?

回答

2

the javadoc

返回此BitSet的“逻辑大小”:在BitSet中加一的最高设置位的索引。

长度只计算设定的位数。

位是[0, 0, 1, 0, 0, 0, 0],在第三个之后是错误的,因此返回的长度。

你无事可做:你的bitSet没问题,如果你已经使用size方法就会很清楚。

+0

谢谢你的回答。 我试图把BitSet看作是一串比特,我期待fromIndex和toIndex的get函数的行为类似于子串函数。 – merlin2011 2013-05-06 07:15:55

0

为什么它应该返回6?让我们来看看:

  1. foo.get(15,21)回报字是4。在二进制表示中,它只是100

  2. 让我们读BitSetjavadoclength()方法:

返回此BitSet的“逻辑大小”:最高设置位的位集索引加1。如果BitSet不包含设定位,则返回零。

好了,我们现在可以检查它的100:最高设置位是2(从0计),加一这将是3。一切都是正确的。

0

的Javadoc BitSet#length(),说返回此BitSet的“逻辑大小”:在BitSet中最高设置位的索引加一。如果BitSet不包含设定位,则返回零。

在你的情况下,foo.get(15,21)给出BitSet[0, 0, 1, 0, 0, 0, 0]。因此结果是2+1=3