jdk之BitSet位运算解析

22 篇文章 0 订阅

不久前项目中用到了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";
        }
    }


}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值