jdk之BitSet位运算解析
来源:互联网 发布:vb 判断文件是否存在 编辑:程序博客网 时间:2024/05/16 06:08
不久前项目中用到了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)); } } /**方法运行结果如下:1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111111111111111001111111111111111111111111111111111111111111111111111111111111000111111111111111111111111111111111111111111111111111111111111000011111111111111111111111111111111111111111111111111111111111000001111111111111111111111111111111111111111111111111111111111000000111111111111111111111111111111111111111111111111111111111000000011111111111111111111111111111111111111111111111111111111000000001111111111111111111111111111111111111111111111111111111000000000111111111111111111111111111111111111111111111111111111000000000011111111111111111111111111111111111111111111111111111000000000001111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111111111000000000000011111111111111111111111111111111111111111111111111000000000000001111111111111111111111111111111111111111111111111000000000000000111111111111111111111111111111111111111111111111000000000000000011111111111111111111111111111111111111111111111000000000000000001111111111111111111111111111111111111111111111000000000000000000111111111111111111111111111111111111111111111000000000000000000011111111111111111111111111111111111111111111000000000000000000001111111111111111111111111111111111111111111000000000000000000000111111111111111111111111111111111111111111000000000000000000000011111111111111111111111111111111111111111000000000000000000000001111111111111111111111111111111111111111000000000000000000000000111111111111111111111111111111111111111000000000000000000000000011111111111111111111111111111111111111000000000000000000000000001111111111111111111111111111111111111000000000000000000000000000111111111111111111111111111111111111000000000000000000000000000011111111111111111111111111111111111000000000000000000000000000001111111111111111111111111111111111000000000000000000000000000000111111111111111111111111111111111000000000000000000000000000000011111111111111111111111111111111000000000000000000000000000000001111111111111111111111111111111000000000000000000000000000000000111111111111111111111111111111000000000000000000000000000000000011111111111111111111111111111000000000000000000000000000000000001111111111111111111111111111000000000000000000000000000000000000111111111111111111111111111000000000000000000000000000000000000011111111111111111111111111000000000000000000000000000000000000001111111111111111111111111000000000000000000000000000000000000000111111111111111111111111000000000000000000000000000000000000000011111111111111111111111000000000000000000000000000000000000000001111111111111111111111000000000000000000000000000000000000000000111111111111111111111000000000000000000000000000000000000000000011111111111111111111000000000000000000000000000000000000000000001111111111111111111000000000000000000000000000000000000000000000111111111111111111000000000000000000000000000000000000000000000011111111111111111000000000000000000000000000000000000000000000001111111111111111000000000000000000000000000000000000000000000000111111111111111000000000000000000000000000000000000000000000000011111111111111000000000000000000000000000000000000000000000000001111111111111000000000000000000000000000000000000000000000000000111111111111000000000000000000000000000000000000000000000000000011111111111000000000000000000000000000000000000000000000000000001111111111000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000001111111000000000000000000000000000000000000000000000000000000000111111000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000001111000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111111111100111111111111111111111111111111111111111111111111111111111111100011111111111111111111111111111111111111111111111111111111111100001111111111111111111111111111111111111111111111111111111111100000111111111111111111111111111111111111111111111111111111111100000011111111111111111111111111111111111111111111111111111111100000001111111111111111111111111111111111111111111111111111111100000000111111111111111111111111111111111111111111111111111111100000000011111111111111111111111111111111111111111111111111111100000000001111111111111111111111111111111111111111111111111111100000000000111111111111111111111111111111111111111111111111111100000000000011111111111111111111111111111111111111111111111111100000000000001111111111111111111111111111111111111111111111111100000000000000111111111111111111111111111111111111111111111111100000000000000011111111111111111111111111111111111111111111111100000000000000001111111111111111111111111111111111111111111111100000000000000000111111111111111111111111111111111111111111111100000000000000000011111111111111111111111111111111111111111111100000000000000000001111111111111111111111111111111111111111111100000000000000000000111111111111111111111111111111111111111111100000000000000000000011111111111111111111111111111111111111111100000000000000000000001111111111111111111111111111111111111111100000000000000000000000111111111111111111111111111111111111111100000000000000000000000011111111111111111111111111111111111111100000000000000000000000001111111111111111111111111111111111111100000000000000000000000000111111111111111111111111111111111111100000000000000000000000000011111111111111111111111111111111111100000000000000000000000000001111111111111111111111111111111111100000000000000000000000000000111111111111111111111111111111111100000000000000000000000000000011111111111111111111111111111111100000000000000000000000000000001111111111111111111111111111111100000000000000000000000000000000111111111111111111111111111111100000000000000000000000000000000011111111111111111111111111111100000000000000000000000000000000001111111111111111111111111111100000000000000000000000000000000000111111111111111111111111111100000000000000000000000000000000000011111111111111111111111111100000000000000000000000000000000000001111111111111111111111111100000000000000000000000000000000000000111111111111111111111111100000000000000000000000000000000000000011111111111111111111111100000000000000000000000000000000000000001111111111111111111111100000000000000000000000000000000000000000111111111111111111111100000000000000000000000000000000000000000011111111111111111111100000000000000000000000000000000000000000001111111111111111111100000000000000000000000000000000000000000000111111111111111111100000000000000000000000000000000000000000000011111111111111111100000000000000000000000000000000000000000000001111111111111111100000000000000000000000000000000000000000000000111111111111111100000000000000000000000000000000000000000000000011111111111111100000000000000000000000000000000000000000000000001111111111111100000000000000000000000000000000000000000000000000111111111111100000000000000000000000000000000000000000000000000011111111111100000000000000000000000000000000000000000000000000001111111111100000000000000000000000000000000000000000000000000000111111111100000000000000000000000000000000000000000000000000000011111111100000000000000000000000000000000000000000000000000000001111111100000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000000000000000000000000001111100000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110 *//**调试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()运行结果如下: 1111111111111111111111111111111111111111111111111111111111111111000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000000000000000000000111100000000000000000000000000000000000000000000000000000000000111110000000000000000000000000000000000000000000000000000000000111111000000000000000000000000000000000000000000000000000000000111111100000000000000000000000000000000000000000000000000000000111111110000000000000000000000000000000000000000000000000000000111111111000000000000000000000000000000000000000000000000000000111111111100000000000000000000000000000000000000000000000000000111111111110000000000000000000000000000000000000000000000000000111111111111000000000000000000000000000000000000000000000000000111111111111100000000000000000000000000000000000000000000000000111111111111110000000000000000000000000000000000000000000000000111111111111111000000000000000000000000000000000000000000000000111111111111111100000000000000000000000000000000000000000000000111111111111111110000000000000000000000000000000000000000000000111111111111111111000000000000000000000000000000000000000000000111111111111111111100000000000000000000000000000000000000000000111111111111111111110000000000000000000000000000000000000000000111111111111111111111000000000000000000000000000000000000000000111111111111111111111100000000000000000000000000000000000000000111111111111111111111110000000000000000000000000000000000000000111111111111111111111111000000000000000000000000000000000000000111111111111111111111111100000000000000000000000000000000000000111111111111111111111111110000000000000000000000000000000000000111111111111111111111111111000000000000000000000000000000000000111111111111111111111111111100000000000000000000000000000000000111111111111111111111111111110000000000000000000000000000000000111111111111111111111111111111000000000000000000000000000000000111111111111111111111111111111100000000000000000000000000000000111111111111111111111111111111110000000000000000000000000000000111111111111111111111111111111111000000000000000000000000000000111111111111111111111111111111111100000000000000000000000000000111111111111111111111111111111111110000000000000000000000000000111111111111111111111111111111111111000000000000000000000000000111111111111111111111111111111111111100000000000000000000000000111111111111111111111111111111111111110000000000000000000000000111111111111111111111111111111111111111000000000000000000000000111111111111111111111111111111111111111100000000000000000000000111111111111111111111111111111111111111110000000000000000000000111111111111111111111111111111111111111111000000000000000000000111111111111111111111111111111111111111111100000000000000000000111111111111111111111111111111111111111111110000000000000000000111111111111111111111111111111111111111111111000000000000000000111111111111111111111111111111111111111111111100000000000000000111111111111111111111111111111111111111111111110000000000000000111111111111111111111111111111111111111111111111000000000000000111111111111111111111111111111111111111111111111100000000000000111111111111111111111111111111111111111111111111110000000000000111111111111111111111111111111111111111111111111111000000000000111111111111111111111111111111111111111111111111111100000000000111111111111111111111111111111111111111111111111111110000000000111111111111111111111111111111111111111111111111111111000000000111111111111111111111111111111111111111111111111111111100000000111111111111111111111111111111111111111111111111111111110000000111111111111111111111111111111111111111111111111111111111000000111111111111111111111111111111111111111111111111111111111100000111111111111111111111111111111111111111111111111111111111110000111111111111111111111111111111111111111111111111111111111111000111111111111111111111111111111111111111111111111111111111111100111111111111111111111111111111111111111111111111111111111111110111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000011000000000000000000000000000000000000000000000000000000000000011100000000000000000000000000000000000000000000000000000000000011110000000000000000000000000000000000000000000000000000000000011111000000000000000000000000000000000000000000000000000000000011111100000000000000000000000000000000000000000000000000000000011111110000000000000000000000000000000000000000000000000000000011111111000000000000000000000000000000000000000000000000000000011111111100000000000000000000000000000000000000000000000000000011111111110000000000000000000000000000000000000000000000000000011111111111000000000000000000000000000000000000000000000000000011111111111100000000000000000000000000000000000000000000000000011111111111110000000000000000000000000000000000000000000000000011111111111111000000000000000000000000000000000000000000000000011111111111111100000000000000000000000000000000000000000000000011111111111111110000000000000000000000000000000000000000000000011111111111111111000000000000000000000000000000000000000000000011111111111111111100000000000000000000000000000000000000000000011111111111111111110000000000000000000000000000000000000000000011111111111111111111000000000000000000000000000000000000000000011111111111111111111100000000000000000000000000000000000000000011111111111111111111110000000000000000000000000000000000000000011111111111111111111111000000000000000000000000000000000000000011111111111111111111111100000000000000000000000000000000000000011111111111111111111111110000000000000000000000000000000000000011111111111111111111111111000000000000000000000000000000000000011111111111111111111111111100000000000000000000000000000000000011111111111111111111111111110000000000000000000000000000000000011111111111111111111111111111000000000000000000000000000000000011111111111111111111111111111100000000000000000000000000000000011111111111111111111111111111110000000000000000000000000000000011111111111111111111111111111111000000000000000000000000000000011111111111111111111111111111111100000000000000000000000000000011111111111111111111111111111111110000000000000000000000000000011111111111111111111111111111111111000000000000000000000000000011111111111111111111111111111111111100000000000000000000000000011111111111111111111111111111111111110000000000000000000000000011111111111111111111111111111111111111000000000000000000000000011111111111111111111111111111111111111100000000000000000000000011111111111111111111111111111111111111110000000000000000000000011111111111111111111111111111111111111111000000000000000000000011111111111111111111111111111111111111111100000000000000000000011111111111111111111111111111111111111111110000000000000000000011111111111111111111111111111111111111111111000000000000000000011111111111111111111111111111111111111111111100000000000000000011111111111111111111111111111111111111111111110000000000000000011111111111111111111111111111111111111111111111000000000000000011111111111111111111111111111111111111111111111100000000000000011111111111111111111111111111111111111111111111110000000000000011111111111111111111111111111111111111111111111111000000000000011111111111111111111111111111111111111111111111111100000000000011111111111111111111111111111111111111111111111111110000000000011111111111111111111111111111111111111111111111111111000000000011111111111111111111111111111111111111111111111111111100000000011111111111111111111111111111111111111111111111111111110000000011111111111111111111111111111111111111111111111111111111000000011111111111111111111111111111111111111111111111111111111100000011111111111111111111111111111111111111111111111111111111110000011111111111111111111111111111111111111111111111111111111111000011111111111111111111111111111111111111111111111111111111111100011111111111111111111111111111111111111111111111111111111111110011111111111111111111111111111111111111111111111111111111111111011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000001 */ /** * 将数字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"; } }}
阅读全文
1 0
- jdk之BitSet位运算解析
- JDK之BitSet
- Java Bitset和位运算
- C语言 - 位运算 - bitset
- ACM位运算&bitset总结
- POJ 2443 Set Operation -- 位运算 + bitset
- STL之bitset位集合
- C++STL之bitset位集合容器
- NYOJ 412 Same binary weight(bitset位运算)
- C++/STL Bitset 位运算类
- NYOJ 412 Same binary weight(bitset位运算)
- 按位运算之异或(^)解析篇
- C++位运算原理解析
- C/C++ 位运算解析
- C/C++ 位运算解析
- 位运算之美
- 位运算之“|=”
- JavaEE之位运算
- 599. Minimum Index Sum of Two Lists
- 安卓开发菜单挡住标题栏解决办法
- leetcode | Path Sum II
- unity UGUI 2048 控制移动
- 队列求迷宫问题
- jdk之BitSet位运算解析
- 嵌入式实训总结
- bzoj1803: Spoj1487 Query on a tree III
- mybatis配置
- JavaSE重新学习
- 13.折半法(二分法)判断该数是否存在于数组
- PyQt5+python3+pycharm开发环境配置
- nginx源码学习(二)ngx_init_cycle(&init_cycle)函数解析
- 期末总结