根据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?
答案 0 :(得分:2)
来自the javadoc:
返回此BitSet的“逻辑大小”:BitSet中最高设置位的索引加1。
长度仅计算设定位。
这些位是[0, 0, 1, 0, 0, 0, 0]
,在第三个位之后是假的,因此返回的长度。
你无事可做:你的bitSet很好,如果你使用size方法就很清楚了。
答案 1 :(得分:0)
为什么它应该返回6
?我们来看看:
foo.get(15,21)
返回单词equals 4
。在二进制表示中,它只是100
。
让我们阅读javadoc
类的length()
方法的BitSet
:
返回此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
。