Java BitSet奇怪的行为

时间:2013-05-06 06:22:15

标签: java bitset

根据Javadoc,以下代码应打印6。但是,它没有明显的原因输出3

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());
    }
}

任何人都可以解释a)为什么我看到这种行为和b)我如何修改代码来修复它,以便提取的Bitset长度为6而不是3?

3 个答案:

答案 0 :(得分:2)

来自the javadoc

  

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

长度仅计算设定位。

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

你无事可做:你的bitSet很好,如果你使用size方法就很清楚了。

答案 1 :(得分:0)

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

  1. foo.get(15,21)返回单词equals 4。在二进制表示中,它只是100

  2. 让我们阅读javadoc类的length()方法的BitSet

  3.   

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

    好的,我们现在可以检查100:最高设置位为2(从0开始计算),再加上一个3。一切都是正确的。

答案 2 :(得分:0)

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

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