不久前项目中用到了BitSet,由于之前没怎么使用过它,所以为了强化,读了几篇分析BitSet源码的文章,算是熟悉了这个类的相关API。读完之后兴致冲冲,非常想要写一篇截止目前最走心的BitSet源码分析博文。然而,各种原因耽误了之后,本人是没有这个心情写了,并且也觉得没必要,因为相关文章还是很多的。
然而,几乎所有的这些有关BitSet源码分析的博文都有一个通病:
这些文章几乎无一列外都细致分析了每一个方法的执行流程,然而,有关BitSet算法实现中的许多重要的位运算细节,都是一笔带过,感觉好遗憾啊,真正的画龙点睛之笔都被省略掉了。可以这么说吧:有的方法即使我没看明白,但是根据方法和相关变量的命名,我也能猜出这个方法大体上干了什么事情,所以,看源码分析的文章,我需要理清某些关键的实现,偏偏网上的很多关于BitSet源码分析的文章都忽略了这一点。
接下来黏贴的一些代码是为了向大家展示BitSet源码中的几个重要的位运算,这篇文章不是一篇详细的源码分析博文,想要了解原理的,读者可以参见其他技术博文,然后读其他博文时候,如果对于其中的位运算比较困惑的,再回头来看一下这篇文章,运行一下我的测试代码中的几个测试方法,相信立马就能心领神会!!!
package com.lihong.DDPush;
import org.junit.Test;
import java.util.BitSet;
/**
* Created by lihong10 on 2017/6/14.
*/
public class BitSetTest {
static final long WORD_MASK = 0xffffffffffffffffL;
/**
* 测试BitSet的使用
*/
public void test1() {
int[] shu = {2, 42, 5, 6, 6, 18, 33, 15, 25, 31, 28, 37};
BitSet bm1 = new BitSet(BitSetTest.getMaxValue(shu));
System.out.println("bm1.size()--" + bm1.size());
BitSetTest.putValueIntoBitSet(shu, bm1);
printBitSet(bm1);
}
/**
* 通过测试观察BitSet的set(int bitIndex)方法的实现细节,set方法源码如下:
public void set(int bitIndex) {
if (bitIndex < 0)
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
int wordIndex = wordIndex(bitIndex);
expandTo(wordIndex);
words[wordIndex] |= (1L << bitIndex); // Restores invariants
checkInvariants();
}
private static int wordIndex(int bitIndex) {
return bitIndex >> ADDRESS_BITS_PER_WORD;
}
*/
@Test
public void test2() {
// BitSet带参数的构造函数通过 ((i - 1) >> 6) + 1 确定long数组的长度
for (int i = 0; i < 130; i++) {
// 通过 i >> 6 确定第i个bit位所属的long的索引,
// 对应源码: int wordIndex = wordIndex(bitIndex);
int a = i >> 6;
// 将指定索引位置的bit所属的long与 该bit位为1其余位为0的数字 进行或运算,从而实现BitSet的set(int bitIndex)操作
//对应源码:words[wordIndex] |= (1L << bitIndex);
String b = toFullBinaryString(1L << i);
long c = 64 - Long.numberOfLeadingZeros(1L << i);
System.out.println(String.format("数字 %3d 属于第%3d 个long, 第%3d 个long与 %s 或运算可以将这个long的第 %2d 位设为 1", i, a, a, b, c));
}
}
/**
test2()方法运行结果如下,看了就能理解BitSet的set方法的实现:so,不再废话了。
数字 0 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000000001 或运算可以将这个long的第 1 位设为 1
数字 1 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000000010 或运算可以将这个long的第 2 位设为 1
数字 2 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000000100 或运算可以将这个long的第 3 位设为 1
数字 3 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000001000 或运算可以将这个long的第 4 位设为 1
数字 4 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000010000 或运算可以将这个long的第 5 位设为 1
数字 5 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000000100000 或运算可以将这个long的第 6 位设为 1
数字 6 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000001000000 或运算可以将这个long的第 7 位设为 1
数字 7 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000010000000 或运算可以将这个long的第 8 位设为 1
数字 8 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000000100000000 或运算可以将这个long的第 9 位设为 1
数字 9 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000001000000000 或运算可以将这个long的第 10 位设为 1
数字 10 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000010000000000 或运算可以将这个long的第 11 位设为 1
数字 11 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000000100000000000 或运算可以将这个long的第 12 位设为 1
数字 12 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000001000000000000 或运算可以将这个long的第 13 位设为 1
数字 13 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000010000000000000 或运算可以将这个long的第 14 位设为 1
数字 14 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000000100000000000000 或运算可以将这个long的第 15 位设为 1
数字 15 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000001000000000000000 或运算可以将这个long的第 16 位设为 1
数字 16 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000010000000000000000 或运算可以将这个long的第 17 位设为 1
数字 17 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000000100000000000000000 或运算可以将这个long的第 18 位设为 1
数字 18 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000001000000000000000000 或运算可以将这个long的第 19 位设为 1
数字 19 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000010000000000000000000 或运算可以将这个long的第 20 位设为 1
数字 20 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000000100000000000000000000 或运算可以将这个long的第 21 位设为 1
数字 21 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000001000000000000000000000 或运算可以将这个long的第 22 位设为 1
数字 22 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000010000000000000000000000 或运算可以将这个long的第 23 位设为 1
数字 23 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000000100000000000000000000000 或运算可以将这个long的第 24 位设为 1
数字 24 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000001000000000000000000000000 或运算可以将这个long的第 25 位设为 1
数字 25 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000010000000000000000000000000 或运算可以将这个long的第 26 位设为 1
数字 26 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000000100000000000000000000000000 或运算可以将这个long的第 27 位设为 1
数字 27 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000001000000000000000000000000000 或运算可以将这个long的第 28 位设为 1
数字 28 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000010000000000000000000000000000 或运算可以将这个long的第 29 位设为 1
数字 29 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000000100000000000000000000000000000 或运算可以将这个long的第 30 位设为 1
数字 30 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000001000000000000000000000000000000 或运算可以将这个long的第 31 位设为 1
数字 31 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000010000000000000000000000000000000 或运算可以将这个long的第 32 位设为 1
数字 32 属于第 0 个long, 第 0 个long与 0000000000000000000000000000000100000000000000000000000000000000 或运算可以将这个long的第 33 位设为 1
数字 33 属于第 0 个long, 第 0 个long与 0000000000000000000000000000001000000000000000000000000000000000 或运算可以将这个long的第 34 位设为 1
数字 34 属于第 0 个long, 第 0 个long与 0000000000000000000000000000010000000000000000000000000000000000 或运算可以将这个long的第 35 位设为 1
数字 35 属于第 0 个long, 第 0 个long与 0000000000000000000000000000100000000000000000000000000000000000 或运算可以将这个long的第 36 位设为 1
数字 36 属于第 0 个long, 第 0 个long与 0000000000000000000000000001000000000000000000000000000000000000 或运算可以将这个long的第 37 位设为 1
数字 37 属于第 0 个long, 第 0 个long与 0000000000000000000000000010000000000000000000000000000000000000 或运算可以将这个long的第 38 位设为 1
数字 38 属于第 0 个long, 第 0 个long与 0000000000000000000000000100000000000000000000000000000000000000 或运算可以将这个long的第 39 位设为 1
数字 39 属于第 0 个long, 第 0 个long与 0000000000000000000000001000000000000000000000000000000000000000 或运算可以将这个long的第 40 位设为 1
数字 40 属于第 0 个long, 第 0 个long与 0000000000000000000000010000000000000000000000000000000000000000 或运算可以将这个long的第 41 位设为 1
数字 41 属于第 0 个long, 第 0 个long与 0000000000000000000000100000000000000000000000000000000000000000 或运算可以将这个long的第 42 位设为 1
数字 42 属于第 0 个long, 第 0 个long与 0000000000000000000001000000000000000000000000000000000000000000 或运算可以将这个long的第 43 位设为 1
数字 43 属于第 0 个long, 第 0 个long与 0000000000000000000010000000000000000000000000000000000000000000 或运算可以将这个long的第 44 位设为 1
数字 44 属于第 0 个long, 第 0 个long与 0000000000000000000100000000000000000000000000000000000000000000 或运算可以将这个long的第 45 位设为 1
数字 45 属于第 0 个long, 第 0 个long与 0000000000000000001000000000000000000000000000000000000000000000 或运算可以将这个long的第 46 位设为 1
数字 46 属于第 0 个long, 第 0 个long与 0000000000000000010000000000000000000000000000000000000000000000 或运算可以将这个long的第 47 位设为 1
数字 47 属于第 0 个long, 第 0 个long与 0000000000000000100000000000000000000000000000000000000000000000 或运算可以将这个long的第 48 位设为 1
数字 48 属于第 0 个long, 第 0 个long与 0000000000000001000000000000000000000000000000000000000000000000 或运算可以将这个long的第 49 位设为 1
数字 49 属于第 0 个long, 第 0 个long与 0000000000000010000000000000000000000000000000000000000000000000 或运算可以将这个long的第 50 位设为 1
数字 50 属于第 0 个long, 第 0 个long与 0000000000000100000000000000000000000000000000000000000000000000 或运算可以将这个long的第 51 位设为 1
数字 51 属于第 0 个long, 第 0 个long与 0000000000001000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 52 位设为 1
数字 52 属于第 0 个long, 第 0 个long与 0000000000010000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 53 位设为 1
数字 53 属于第 0 个long, 第 0 个long与 0000000000100000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 54 位设为 1
数字 54 属于第 0 个long, 第 0 个long与 0000000001000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 55 位设为 1
数字 55 属于第 0 个long, 第 0 个long与 0000000010000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 56 位设为 1
数字 56 属于第 0 个long, 第 0 个long与 0000000100000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 57 位设为 1
数字 57 属于第 0 个long, 第 0 个long与 0000001000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 58 位设为 1
数字 58 属于第 0 个long, 第 0 个long与 0000010000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 59 位设为 1
数字 59 属于第 0 个long, 第 0 个long与 0000100000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 60 位设为 1
数字 60 属于第 0 个long, 第 0 个long与 0001000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 61 位设为 1
数字 61 属于第 0 个long, 第 0 个long与 0010000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 62 位设为 1
数字 62 属于第 0 个long, 第 0 个long与 0100000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 63 位设为 1
数字 63 属于第 0 个long, 第 0 个long与 1000000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 64 位设为 1
数字 64 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000000001 或运算可以将这个long的第 1 位设为 1
数字 65 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000000010 或运算可以将这个long的第 2 位设为 1
数字 66 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000000100 或运算可以将这个long的第 3 位设为 1
数字 67 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000001000 或运算可以将这个long的第 4 位设为 1
数字 68 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000010000 或运算可以将这个long的第 5 位设为 1
数字 69 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000000100000 或运算可以将这个long的第 6 位设为 1
数字 70 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000001000000 或运算可以将这个long的第 7 位设为 1
数字 71 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000010000000 或运算可以将这个long的第 8 位设为 1
数字 72 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000000100000000 或运算可以将这个long的第 9 位设为 1
数字 73 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000001000000000 或运算可以将这个long的第 10 位设为 1
数字 74 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000010000000000 或运算可以将这个long的第 11 位设为 1
数字 75 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000000100000000000 或运算可以将这个long的第 12 位设为 1
数字 76 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000001000000000000 或运算可以将这个long的第 13 位设为 1
数字 77 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000010000000000000 或运算可以将这个long的第 14 位设为 1
数字 78 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000000100000000000000 或运算可以将这个long的第 15 位设为 1
数字 79 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000001000000000000000 或运算可以将这个long的第 16 位设为 1
数字 80 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000010000000000000000 或运算可以将这个long的第 17 位设为 1
数字 81 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000000100000000000000000 或运算可以将这个long的第 18 位设为 1
数字 82 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000001000000000000000000 或运算可以将这个long的第 19 位设为 1
数字 83 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000010000000000000000000 或运算可以将这个long的第 20 位设为 1
数字 84 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000000100000000000000000000 或运算可以将这个long的第 21 位设为 1
数字 85 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000001000000000000000000000 或运算可以将这个long的第 22 位设为 1
数字 86 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000010000000000000000000000 或运算可以将这个long的第 23 位设为 1
数字 87 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000000100000000000000000000000 或运算可以将这个long的第 24 位设为 1
数字 88 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000001000000000000000000000000 或运算可以将这个long的第 25 位设为 1
数字 89 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000010000000000000000000000000 或运算可以将这个long的第 26 位设为 1
数字 90 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000000100000000000000000000000000 或运算可以将这个long的第 27 位设为 1
数字 91 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000001000000000000000000000000000 或运算可以将这个long的第 28 位设为 1
数字 92 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000010000000000000000000000000000 或运算可以将这个long的第 29 位设为 1
数字 93 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000000100000000000000000000000000000 或运算可以将这个long的第 30 位设为 1
数字 94 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000001000000000000000000000000000000 或运算可以将这个long的第 31 位设为 1
数字 95 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000010000000000000000000000000000000 或运算可以将这个long的第 32 位设为 1
数字 96 属于第 1 个long, 第 1 个long与 0000000000000000000000000000000100000000000000000000000000000000 或运算可以将这个long的第 33 位设为 1
数字 97 属于第 1 个long, 第 1 个long与 0000000000000000000000000000001000000000000000000000000000000000 或运算可以将这个long的第 34 位设为 1
数字 98 属于第 1 个long, 第 1 个long与 0000000000000000000000000000010000000000000000000000000000000000 或运算可以将这个long的第 35 位设为 1
数字 99 属于第 1 个long, 第 1 个long与 0000000000000000000000000000100000000000000000000000000000000000 或运算可以将这个long的第 36 位设为 1
数字 100 属于第 1 个long, 第 1 个long与 0000000000000000000000000001000000000000000000000000000000000000 或运算可以将这个long的第 37 位设为 1
数字 101 属于第 1 个long, 第 1 个long与 0000000000000000000000000010000000000000000000000000000000000000 或运算可以将这个long的第 38 位设为 1
数字 102 属于第 1 个long, 第 1 个long与 0000000000000000000000000100000000000000000000000000000000000000 或运算可以将这个long的第 39 位设为 1
数字 103 属于第 1 个long, 第 1 个long与 0000000000000000000000001000000000000000000000000000000000000000 或运算可以将这个long的第 40 位设为 1
数字 104 属于第 1 个long, 第 1 个long与 0000000000000000000000010000000000000000000000000000000000000000 或运算可以将这个long的第 41 位设为 1
数字 105 属于第 1 个long, 第 1 个long与 0000000000000000000000100000000000000000000000000000000000000000 或运算可以将这个long的第 42 位设为 1
数字 106 属于第 1 个long, 第 1 个long与 0000000000000000000001000000000000000000000000000000000000000000 或运算可以将这个long的第 43 位设为 1
数字 107 属于第 1 个long, 第 1 个long与 0000000000000000000010000000000000000000000000000000000000000000 或运算可以将这个long的第 44 位设为 1
数字 108 属于第 1 个long, 第 1 个long与 0000000000000000000100000000000000000000000000000000000000000000 或运算可以将这个long的第 45 位设为 1
数字 109 属于第 1 个long, 第 1 个long与 0000000000000000001000000000000000000000000000000000000000000000 或运算可以将这个long的第 46 位设为 1
数字 110 属于第 1 个long, 第 1 个long与 0000000000000000010000000000000000000000000000000000000000000000 或运算可以将这个long的第 47 位设为 1
数字 111 属于第 1 个long, 第 1 个long与 0000000000000000100000000000000000000000000000000000000000000000 或运算可以将这个long的第 48 位设为 1
数字 112 属于第 1 个long, 第 1 个long与 0000000000000001000000000000000000000000000000000000000000000000 或运算可以将这个long的第 49 位设为 1
数字 113 属于第 1 个long, 第 1 个long与 0000000000000010000000000000000000000000000000000000000000000000 或运算可以将这个long的第 50 位设为 1
数字 114 属于第 1 个long, 第 1 个long与 0000000000000100000000000000000000000000000000000000000000000000 或运算可以将这个long的第 51 位设为 1
数字 115 属于第 1 个long, 第 1 个long与 0000000000001000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 52 位设为 1
数字 116 属于第 1 个long, 第 1 个long与 0000000000010000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 53 位设为 1
数字 117 属于第 1 个long, 第 1 个long与 0000000000100000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 54 位设为 1
数字 118 属于第 1 个long, 第 1 个long与 0000000001000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 55 位设为 1
数字 119 属于第 1 个long, 第 1 个long与 0000000010000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 56 位设为 1
数字 120 属于第 1 个long, 第 1 个long与 0000000100000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 57 位设为 1
数字 121 属于第 1 个long, 第 1 个long与 0000001000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 58 位设为 1
数字 122 属于第 1 个long, 第 1 个long与 0000010000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 59 位设为 1
数字 123 属于第 1 个long, 第 1 个long与 0000100000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 60 位设为 1
数字 124 属于第 1 个long, 第 1 个long与 0001000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 61 位设为 1
数字 125 属于第 1 个long, 第 1 个long与 0010000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 62 位设为 1
数字 126 属于第 1 个long, 第 1 个long与 0100000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 63 位设为 1
数字 127 属于第 1 个long, 第 1 个long与 1000000000000000000000000000000000000000000000000000000000000000 或运算可以将这个long的第 64 位设为 1
数字 128 属于第 2 个long, 第 2 个long与 0000000000000000000000000000000000000000000000000000000000000001 或运算可以将这个long的第 1 位设为 1
数字 129 属于第 2 个long, 第 2 个long与 0000000000000000000000000000000000000000000000000000000000000010 或运算可以将这个long的第 2 位设为 1
*/
/**
调试BitSet的方法set(int fromIndex, int toIndex)中的关键代码:
long firstWordMask = WORD_MASK << fromIndex;
*/
@Test
public void test3() {
//
for (int i = 0; i < 130; i++) {
System.out.println(toFullBinaryString(WORD_MASK << i));
}
}
/**
方法运行结果如下:
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111110
1111111111111111111111111111111111111111111111111111111111111100
1111111111111111111111111111111111111111111111111111111111111000
1111111111111111111111111111111111111111111111111111111111110000
1111111111111111111111111111111111111111111111111111111111100000
1111111111111111111111111111111111111111111111111111111111000000
1111111111111111111111111111111111111111111111111111111110000000
1111111111111111111111111111111111111111111111111111111100000000
1111111111111111111111111111111111111111111111111111111000000000
1111111111111111111111111111111111111111111111111111110000000000
1111111111111111111111111111111111111111111111111111100000000000
1111111111111111111111111111111111111111111111111111000000000000
1111111111111111111111111111111111111111111111111110000000000000
1111111111111111111111111111111111111111111111111100000000000000
1111111111111111111111111111111111111111111111111000000000000000
1111111111111111111111111111111111111111111111110000000000000000
1111111111111111111111111111111111111111111111100000000000000000
1111111111111111111111111111111111111111111111000000000000000000
1111111111111111111111111111111111111111111110000000000000000000
1111111111111111111111111111111111111111111100000000000000000000
1111111111111111111111111111111111111111111000000000000000000000
1111111111111111111111111111111111111111110000000000000000000000
1111111111111111111111111111111111111111100000000000000000000000
1111111111111111111111111111111111111111000000000000000000000000
1111111111111111111111111111111111111110000000000000000000000000
1111111111111111111111111111111111111100000000000000000000000000
1111111111111111111111111111111111111000000000000000000000000000
1111111111111111111111111111111111110000000000000000000000000000
1111111111111111111111111111111111100000000000000000000000000000
1111111111111111111111111111111111000000000000000000000000000000
1111111111111111111111111111111110000000000000000000000000000000
1111111111111111111111111111111100000000000000000000000000000000
1111111111111111111111111111111000000000000000000000000000000000
1111111111111111111111111111110000000000000000000000000000000000
1111111111111111111111111111100000000000000000000000000000000000
1111111111111111111111111111000000000000000000000000000000000000
1111111111111111111111111110000000000000000000000000000000000000
1111111111111111111111111100000000000000000000000000000000000000
1111111111111111111111111000000000000000000000000000000000000000
1111111111111111111111110000000000000000000000000000000000000000
1111111111111111111111100000000000000000000000000000000000000000
1111111111111111111111000000000000000000000000000000000000000000
1111111111111111111110000000000000000000000000000000000000000000
1111111111111111111100000000000000000000000000000000000000000000
1111111111111111111000000000000000000000000000000000000000000000
1111111111111111110000000000000000000000000000000000000000000000
1111111111111111100000000000000000000000000000000000000000000000
1111111111111111000000000000000000000000000000000000000000000000
1111111111111110000000000000000000000000000000000000000000000000
1111111111111100000000000000000000000000000000000000000000000000
1111111111111000000000000000000000000000000000000000000000000000
1111111111110000000000000000000000000000000000000000000000000000
1111111111100000000000000000000000000000000000000000000000000000
1111111111000000000000000000000000000000000000000000000000000000
1111111110000000000000000000000000000000000000000000000000000000
1111111100000000000000000000000000000000000000000000000000000000
1111111000000000000000000000000000000000000000000000000000000000
1111110000000000000000000000000000000000000000000000000000000000
1111100000000000000000000000000000000000000000000000000000000000
1111000000000000000000000000000000000000000000000000000000000000
1110000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000
1000000000000000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111110
1111111111111111111111111111111111111111111111111111111111111100
1111111111111111111111111111111111111111111111111111111111111000
1111111111111111111111111111111111111111111111111111111111110000
1111111111111111111111111111111111111111111111111111111111100000
1111111111111111111111111111111111111111111111111111111111000000
1111111111111111111111111111111111111111111111111111111110000000
1111111111111111111111111111111111111111111111111111111100000000
1111111111111111111111111111111111111111111111111111111000000000
1111111111111111111111111111111111111111111111111111110000000000
1111111111111111111111111111111111111111111111111111100000000000
1111111111111111111111111111111111111111111111111111000000000000
1111111111111111111111111111111111111111111111111110000000000000
1111111111111111111111111111111111111111111111111100000000000000
1111111111111111111111111111111111111111111111111000000000000000
1111111111111111111111111111111111111111111111110000000000000000
1111111111111111111111111111111111111111111111100000000000000000
1111111111111111111111111111111111111111111111000000000000000000
1111111111111111111111111111111111111111111110000000000000000000
1111111111111111111111111111111111111111111100000000000000000000
1111111111111111111111111111111111111111111000000000000000000000
1111111111111111111111111111111111111111110000000000000000000000
1111111111111111111111111111111111111111100000000000000000000000
1111111111111111111111111111111111111111000000000000000000000000
1111111111111111111111111111111111111110000000000000000000000000
1111111111111111111111111111111111111100000000000000000000000000
1111111111111111111111111111111111111000000000000000000000000000
1111111111111111111111111111111111110000000000000000000000000000
1111111111111111111111111111111111100000000000000000000000000000
1111111111111111111111111111111111000000000000000000000000000000
1111111111111111111111111111111110000000000000000000000000000000
1111111111111111111111111111111100000000000000000000000000000000
1111111111111111111111111111111000000000000000000000000000000000
1111111111111111111111111111110000000000000000000000000000000000
1111111111111111111111111111100000000000000000000000000000000000
1111111111111111111111111111000000000000000000000000000000000000
1111111111111111111111111110000000000000000000000000000000000000
1111111111111111111111111100000000000000000000000000000000000000
1111111111111111111111111000000000000000000000000000000000000000
1111111111111111111111110000000000000000000000000000000000000000
1111111111111111111111100000000000000000000000000000000000000000
1111111111111111111111000000000000000000000000000000000000000000
1111111111111111111110000000000000000000000000000000000000000000
1111111111111111111100000000000000000000000000000000000000000000
1111111111111111111000000000000000000000000000000000000000000000
1111111111111111110000000000000000000000000000000000000000000000
1111111111111111100000000000000000000000000000000000000000000000
1111111111111111000000000000000000000000000000000000000000000000
1111111111111110000000000000000000000000000000000000000000000000
1111111111111100000000000000000000000000000000000000000000000000
1111111111111000000000000000000000000000000000000000000000000000
1111111111110000000000000000000000000000000000000000000000000000
1111111111100000000000000000000000000000000000000000000000000000
1111111111000000000000000000000000000000000000000000000000000000
1111111110000000000000000000000000000000000000000000000000000000
1111111100000000000000000000000000000000000000000000000000000000
1111111000000000000000000000000000000000000000000000000000000000
1111110000000000000000000000000000000000000000000000000000000000
1111100000000000000000000000000000000000000000000000000000000000
1111000000000000000000000000000000000000000000000000000000000000
1110000000000000000000000000000000000000000000000000000000000000
1100000000000000000000000000000000000000000000000000000000000000
1000000000000000000000000000000000000000000000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111110
*/
/**
调试BitSet的方法set(int fromIndex, int toIndex)中的关键代码:
long lastWordMask = WORD_MASK >>> -toIndex;
*/
@Test
public void test4() {
// long lastWordMask = WORD_MASK >>> -toIndex;
for (int i = 0; i < 130; i++) {
System.out.println(toFullBinaryString(WORD_MASK >>> -i));
}
}
/**
test4()运行结果如下:
1111111111111111111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000011
0000000000000000000000000000000000000000000000000000000000000111
0000000000000000000000000000000000000000000000000000000000001111
0000000000000000000000000000000000000000000000000000000000011111
0000000000000000000000000000000000000000000000000000000000111111
0000000000000000000000000000000000000000000000000000000001111111
0000000000000000000000000000000000000000000000000000000011111111
0000000000000000000000000000000000000000000000000000000111111111
0000000000000000000000000000000000000000000000000000001111111111
0000000000000000000000000000000000000000000000000000011111111111
0000000000000000000000000000000000000000000000000000111111111111
0000000000000000000000000000000000000000000000000001111111111111
0000000000000000000000000000000000000000000000000011111111111111
0000000000000000000000000000000000000000000000000111111111111111
0000000000000000000000000000000000000000000000001111111111111111
0000000000000000000000000000000000000000000000011111111111111111
0000000000000000000000000000000000000000000000111111111111111111
0000000000000000000000000000000000000000000001111111111111111111
0000000000000000000000000000000000000000000011111111111111111111
0000000000000000000000000000000000000000000111111111111111111111
0000000000000000000000000000000000000000001111111111111111111111
0000000000000000000000000000000000000000011111111111111111111111
0000000000000000000000000000000000000000111111111111111111111111
0000000000000000000000000000000000000001111111111111111111111111
0000000000000000000000000000000000000011111111111111111111111111
0000000000000000000000000000000000000111111111111111111111111111
0000000000000000000000000000000000001111111111111111111111111111
0000000000000000000000000000000000011111111111111111111111111111
0000000000000000000000000000000000111111111111111111111111111111
0000000000000000000000000000000001111111111111111111111111111111
0000000000000000000000000000000011111111111111111111111111111111
0000000000000000000000000000000111111111111111111111111111111111
0000000000000000000000000000001111111111111111111111111111111111
0000000000000000000000000000011111111111111111111111111111111111
0000000000000000000000000000111111111111111111111111111111111111
0000000000000000000000000001111111111111111111111111111111111111
0000000000000000000000000011111111111111111111111111111111111111
0000000000000000000000000111111111111111111111111111111111111111
0000000000000000000000001111111111111111111111111111111111111111
0000000000000000000000011111111111111111111111111111111111111111
0000000000000000000000111111111111111111111111111111111111111111
0000000000000000000001111111111111111111111111111111111111111111
0000000000000000000011111111111111111111111111111111111111111111
0000000000000000000111111111111111111111111111111111111111111111
0000000000000000001111111111111111111111111111111111111111111111
0000000000000000011111111111111111111111111111111111111111111111
0000000000000000111111111111111111111111111111111111111111111111
0000000000000001111111111111111111111111111111111111111111111111
0000000000000011111111111111111111111111111111111111111111111111
0000000000000111111111111111111111111111111111111111111111111111
0000000000001111111111111111111111111111111111111111111111111111
0000000000011111111111111111111111111111111111111111111111111111
0000000000111111111111111111111111111111111111111111111111111111
0000000001111111111111111111111111111111111111111111111111111111
0000000011111111111111111111111111111111111111111111111111111111
0000000111111111111111111111111111111111111111111111111111111111
0000001111111111111111111111111111111111111111111111111111111111
0000011111111111111111111111111111111111111111111111111111111111
0000111111111111111111111111111111111111111111111111111111111111
0001111111111111111111111111111111111111111111111111111111111111
0011111111111111111111111111111111111111111111111111111111111111
0111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000011
0000000000000000000000000000000000000000000000000000000000000111
0000000000000000000000000000000000000000000000000000000000001111
0000000000000000000000000000000000000000000000000000000000011111
0000000000000000000000000000000000000000000000000000000000111111
0000000000000000000000000000000000000000000000000000000001111111
0000000000000000000000000000000000000000000000000000000011111111
0000000000000000000000000000000000000000000000000000000111111111
0000000000000000000000000000000000000000000000000000001111111111
0000000000000000000000000000000000000000000000000000011111111111
0000000000000000000000000000000000000000000000000000111111111111
0000000000000000000000000000000000000000000000000001111111111111
0000000000000000000000000000000000000000000000000011111111111111
0000000000000000000000000000000000000000000000000111111111111111
0000000000000000000000000000000000000000000000001111111111111111
0000000000000000000000000000000000000000000000011111111111111111
0000000000000000000000000000000000000000000000111111111111111111
0000000000000000000000000000000000000000000001111111111111111111
0000000000000000000000000000000000000000000011111111111111111111
0000000000000000000000000000000000000000000111111111111111111111
0000000000000000000000000000000000000000001111111111111111111111
0000000000000000000000000000000000000000011111111111111111111111
0000000000000000000000000000000000000000111111111111111111111111
0000000000000000000000000000000000000001111111111111111111111111
0000000000000000000000000000000000000011111111111111111111111111
0000000000000000000000000000000000000111111111111111111111111111
0000000000000000000000000000000000001111111111111111111111111111
0000000000000000000000000000000000011111111111111111111111111111
0000000000000000000000000000000000111111111111111111111111111111
0000000000000000000000000000000001111111111111111111111111111111
0000000000000000000000000000000011111111111111111111111111111111
0000000000000000000000000000000111111111111111111111111111111111
0000000000000000000000000000001111111111111111111111111111111111
0000000000000000000000000000011111111111111111111111111111111111
0000000000000000000000000000111111111111111111111111111111111111
0000000000000000000000000001111111111111111111111111111111111111
0000000000000000000000000011111111111111111111111111111111111111
0000000000000000000000000111111111111111111111111111111111111111
0000000000000000000000001111111111111111111111111111111111111111
0000000000000000000000011111111111111111111111111111111111111111
0000000000000000000000111111111111111111111111111111111111111111
0000000000000000000001111111111111111111111111111111111111111111
0000000000000000000011111111111111111111111111111111111111111111
0000000000000000000111111111111111111111111111111111111111111111
0000000000000000001111111111111111111111111111111111111111111111
0000000000000000011111111111111111111111111111111111111111111111
0000000000000000111111111111111111111111111111111111111111111111
0000000000000001111111111111111111111111111111111111111111111111
0000000000000011111111111111111111111111111111111111111111111111
0000000000000111111111111111111111111111111111111111111111111111
0000000000001111111111111111111111111111111111111111111111111111
0000000000011111111111111111111111111111111111111111111111111111
0000000000111111111111111111111111111111111111111111111111111111
0000000001111111111111111111111111111111111111111111111111111111
0000000011111111111111111111111111111111111111111111111111111111
0000000111111111111111111111111111111111111111111111111111111111
0000001111111111111111111111111111111111111111111111111111111111
0000011111111111111111111111111111111111111111111111111111111111
0000111111111111111111111111111111111111111111111111111111111111
0001111111111111111111111111111111111111111111111111111111111111
0011111111111111111111111111111111111111111111111111111111111111
0111111111111111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111111111111111
0000000000000000000000000000000000000000000000000000000000000001
*/
/**
* 将数字long转换成长度是64的二进制字符串
* @param i
* @return
*/
public static String toFullBinaryString(long i) {
return toUnsignedString(i, 1);
}
/**
* /**
* 将数字long转换成长度是64的二进制字符串
* @param i
* @return
*/
private static String toUnsignedString(long i, int shift) {
char[] buf = new char[64];
for(int k = 0; k < buf.length; k++) {
buf[k] = '0';
}
int charPos = 64;
int radix = 1 << shift;
long mask = radix - 1;
do {
buf[--charPos] = digits[(int)(i & mask)];
i >>>= shift;
} while (i != 0);
return new String(buf);
}
static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};
//初始全部为false,这个你可以不用,因为默认都是false
public static void initBitSet(BitSet bs) {
for (int i = 0; i < bs.size(); i++) {
bs.set(i, false);
}
}
//打印
public static void printBitSet(BitSet bs) {
StringBuffer buf = new StringBuffer();
buf.append("[\n");
for (int i = 0; i < bs.size(); i++) {
if (i < bs.size() - 1) {
buf.append(BitSetTest.getBitTo10(bs.get(i)) + ",");
} else {
buf.append(BitSetTest.getBitTo10(bs.get(i)));
}
if ((i + 1) % 8 == 0 && i != 0) {
buf.append("\n");
}
}
buf.append("]");
System.out.println(buf.toString());
}
//找出数据集合最大值
public static int getMaxValue(int[] zu) {
int temp = 0;
temp = zu[0];
for (int i = 0; i < zu.length; i++) {
if (temp < zu[i]) {
temp = zu[i];
}
}
System.out.println("maxvalue:" + temp);
return temp;
}
//放值
public static void putValueIntoBitSet(int[] shu, BitSet bs) {
for (int i = 0; i < shu.length; i++) {
bs.set(shu[i], true);
}
}
//true,false换成1,0为了好看
public static String getBitTo10(boolean flag) {
String a = "";
if (flag == true) {
return "1";
} else {
return "0";
}
}
}