jdk之BitSet位运算解析

【人工智能系列 - 智能硬件 - 10】JBits应用程序接口 JBits SDK是由Xilinx公司Levi等人开发的,提供了对Xilinx 公司的Virtex系列FPGA器件进行实时重构和实时参数化设计的接口和工具。 这些接口和工具在设计过程中可以用来进行编码、调试、仿真和校验。 每种接口和工具都提供了不同抽象层次的设计支持,用户可以根据需要选择各自设计的抽象层次。 同时JBits SDK支持对Virtex系列FPGA器件的动态局部重构设计,并且能够... 阅读详情

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


}
java位运算实战:2个高频场景,比常规写法更高效 位运算虽好,但有两个容易踩坑的点,一定要注意:1. 位运算只适用于整数类型(byte、short、int、long),不能用于浮点数(float、double),否则会编译报错;2. 区分右移(>>)和无符号右移(>>>):我们今天用的 >> 是算术右移,会保留符号位(负数右移左边补1);而 >>> 是无符号右移,左边一律补0,适合无符号整数的运算(日常开发中很少用); 阅读详情

相关推荐

Java中EnumSet替代位域的技术解析与实践

在Java开发中,位域(bit field)曾是处理标志位的传统方案,通过二进制位运算实现高效存储。然而这种技术存在可读性差、类型不安全等缺陷。现代Java推荐使用EnumSet作为类型安全的替代方案,它基于枚举类型实现,通过位运算优化集合操作性能。EnumSet不仅解决了位域的可维护性问题,还保持了接近原生位操作的高效性,特别适用于权限控制、状态机等场景。从工程实践角度看,EnumSet与Java集合框架无缝集成,支持模式匹配等高级用法,同时需要注意线程安全与序列化兼容性等实现细节。随着Java版本演进,

weixin_30919571的博客 550

【人工智能系列 - 智能硬件 - 13】附录:JBits SDK的详细说明

JBits是一系列应用程序接口,可以用来配置Xilinx系列FPGA的位流。这组API允许Java应用对Xilinx Virtex-II系列芯片的位流进行动态修改。速度是这种方法的一个主要优点。用来配置的Java程序平台可以快速的编译和运行。JBits可能作为一个独立的工具来使用或者作为设计其它工具的基础平台,包括传统的布局布线CAD应用以及更多的相似的专用工具。

星辉领域 812

避坑指南:sherpa-onnx中文语音识别模型实测对比(2024最新版)

本文实测对比了sherpa-onnx框架下Paraformer、Zipformer、SenseVoice等主流中文语音识别模型。针对不同应用场景,从准确率、延迟、资源占用等维度提供选型建议,并分享部署避坑指南与最佳实践,帮助开发者高效选择本地语音转文字方案。

xray4的博客 2286

Jdk中BitSet的使用

Jdk中BitSet的使用 优点:大量数据节省内存 jdk中自带的BitSet基于BitMap的思想。 BitMaP中将四个字节的int类型按bit位放置,用每位的0/1表示该数存在与否。第一个字节每bit位代表0-7,依次排列,即原来表示一个int类型数据的内存,可以表示32个(原来是四个字节一个数,现在一个字节8个数),这样的属性也决定了BitMap的并不是适用于所有情况。 BitSet底层...

qq_44565971的博客 333

打造会自主学习的 AI 助手:OpenClaw 记忆系统完全指南

这不是科幻,这是我正在使用的系统。我的 AI 助手「小琳」已经运行了一段时间,积累了大量的知识和经验,而且还在不断学习成长。心跳(Heartbeat)是 OpenClaw 的定时轮询机制,可以让 AI 主动做一些事情。你有没有遇到过这样的困扰:每次和 AI 对话,它都像失忆了一样,之前聊过的内容完全不记得?设置定时任务:每天早上 8 点,查询天气和热点新闻,通过钉钉推送给我。让你的 AI 助手拥有持久记忆,能够自主学习、总结经验、不断成长。这不仅仅是一个「能记住事情的 AI」,而是一个。

Honmaple的博客 1634

PHY6252开发实战:从零构建BLE串口透传应用

本文详细介绍了PHY6252开发板在BLE串口透传应用中的实战经验,包括开发环境搭建、BLE串口透传例程解析、AT指令集实现与扩展、数据透传机制优化以及常见问题排查指南。通过智能家居遥控器项目案例,展示了PHY6252在低功耗物联网设备开发中的实际应用。

weixin_29183637的博客 314

bitset用法小结

bitset bitset大概就是类似于bool数组一样的东西 但是它的每个位置只占1bit(特别特别小) bitset的原理大概是将很多数压成一个,从而节省空间和时间(暴力出奇迹) 一般来说bitset会让你的算法复杂度 $/32$(具体是什么要看计算机) 定义与初始化 使用bitset类型需$#include<bitset>$ bitset类型在定义时就需要指定所占的...

weixin_30414305的博客 188

从理论到实践:全面解析Cmk(设备能力指数)的应用与优化

本文全面解析了设备能力指数Cmk的核心概念、计算逻辑与关键应用场景。Cmk作为衡量设备本身固有加工能力的黄金标准,在设备验收、大修后验证及过程能力根因分析中至关重要。文章通过实战案例,详细阐述了执行Cmk测试的“五大固定”黄金法则、数据计算分析方法,并提供了Cmk不达标时的系统性排查与优化策略,帮助制造企业实现预防性质量管理。

jump7的博客 527

BitSet性能优化之道:从源码看Java位操作的极限提速

BitSet是Java.util包中的一个类,它实现了一个按需增长的位向量。Bitset通过每个位(bit)来存储一个布尔值,相比传统的布尔数组,其内存占用仅为后者的1/8甚至更少。大数据去重和判重(如布隆过滤器实现)权限管理系统中的权限标记海量数据排序(位图排序)编译器中的活跃变量分析网络爬虫中的URL去重BitSet作为Java中位操作的极致体现,通过深入硬件层面的优化,在大数据处理场景下展现出卓越的性能。

Sjjdskk的博客 435

从编译到调通:RK3588与FPGA的PCIe XDMA驱动实战解析

本文详细解析了在RK3588平台上为FPGA板卡编译、加载与调试PCIe XDMA驱动的完整实战流程。内容涵盖环境准备、Makefile深度定制、编译排错、驱动加载与内核日志解读、设备节点分析以及用户空间编程实战,旨在帮助开发者打通RK3588与FPGA之间的高速PCIe通信链路,实现稳定可靠的数据传输。

weixin_29304021的博客 484

抖音X-Medusa风控逆向:unidbg环境重建与魔改AES还原

X-Medusa并非传统加密算法,而是深度耦合运行时环境的动态混淆系统,其核心是硬件指纹感知、线程上下文绑定与非标AES变异。理解其原理需跳出‘找密钥’思维,转向对CPU型号、系统属性、微秒级时间及内存布局的综合建模。技术价值在于将不可控的客户端风控,转化为可复现、可配置、可运维的服务化能力;典型应用场景包括合规数据采集、API协议适配与移动安全研究。本文聚焦Android native层逆向实践,基于unidbg实现高保真环境模拟,并完整还原S-Box动态生成、MixColumns矩阵变异与轮密钥XOR扰

weixin_33783283的博客 689

死磕Java集合之BitSet源码分析(JDK18)

因为Java中没有new bit[]这种直接创建一个bit数组的方式,所以Java提供了BitSet来实现位图,BitSet是采用一个long型的数组来实现位图的。BitSet的首个long型数组表示的是[0, 63]这64个元素。BitSet中的实现充分利用了位运算,速度很快,因为是位图,所以占用空间也比较小。下面是boolean数组和BitSet的空间占用对比可以看出boolean数组,占用的空间是1040 bytes,BitSet占用的空间是24 + 144 = 168 bytes。

qq_38710264的博客 449

基因树构建全流程:从OrthoFinder到iTOL的保姆级教程(附兰科植物案例)

本文提供了一份从OrthoFinder到iTOL的基因树构建全流程保姆级教程。详细解析了利用OrthoFinder构建物种树、IQ-TREE构建无根基因树、Notung进行树调和生根,以及最终在iTOL中实现专业可视化的每一步操作与实战经验,并以兰科植物NB-ARC基因家族为例进行演示,帮助研究者系统掌握基因树分析方法。

tequila的博客 524

BitSet实现原理解析

1.BitSet介绍 Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也都是位运算,每一位只用来存储0,1值,主要用于对数据的标记。 Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用的时候可以根据某一个位是否为0表示此数是否出现过。JDK中的BitSet集合对是布隆过滤器中经常使用的数据结构Bitmap的相对简单的实现...

qq_2300688967的博客 1360

【凌智视觉模块】rv1106 部署 pp-humseg 模型

人像分割技术实现摘要 人像分割是利用计算机视觉技术将图像/视频中的人物与背景分离的像素级处理技术。凌智视觉模块基于RV1106芯片开发,支持高效视觉模型部署。当前主流方法包括PP-HumanSeg、BiSeNet等深度学习模型,其中PP-HumanSegV2以96.63% mIoU精度和63FPS手机端速度成为SOTA方案。 实现流程包含: 初始化RKNN模型后端 图像预处理(尺寸调整、颜色空间转换) 执行模型推理 后处理(概率解码、动态阈值分割、形态学优化) 代码实现要点: 使用RKNPU2Backend

m0_50786932的博客 986

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

BitSet在搜索里面压缩参数的使用

使用bitset的方法对传入elasticsearch搜索的参数进行压缩,加快传输与搜索

zengyr49的博客 401

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java bitset javadoc,BitSet的源码研究

这几天看Bloom Filter,因为在java中,并不能像C/C++一样直接操纵bit级别的数据,所以只能另想办法替代:1)使用整数数组来替代;2)使用BitSet;BitSet实际是由“二进制位”构成的一个Vector。如果希望高效率地保存大量“开-关”信息,就应使用BitSet。它只有从尺寸的角度看才有意义;如果希望的高效率的访问,那么它的速度会比使用一些固有类型的数组慢一些。BitSet的...

weixin_33408420的博客 116

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java中BitSet完美实现bitmap算法

bitmap顾名思义就是位映射, 先看一个场景 有一个int数组{1,2,5,7},初步估计占用内存4*4=16字节,但是假如有10亿个这样的数呢,10亿*4/(102410241024)=3.72G左右。 如果这样的一个大的数据做查找和排序,那估计内存也崩溃了,有人说,这些数据可以不用一次性加载,那就是要存盘了,存盘必然消耗IO。 如果用bitmap算法去处理就会简单高效的很多,解决如下 一个b...

ziyinajava的博客 1364

Java位运算实战:从HashMap源码到算法优化,提升代码性能

位运算作为计算机底层核心操作,通过直接操作二进制位实现高效计算。其原理基于二进制与补码表示,利用与(&)、或(|)、异或(^)等运算符进行位级操作,能显著提升程序性能。技术价值在于减少CPU指令周期,优化内存使用,常见于高性能计算、算法优化和系统设计中。在Java开发中,位运算广泛应用于HashMap容量计算、线程池状态管理等场景,例如通过(n & (n-1))判断2的幂次方,或使用异或运算高效查找数组中唯一不重复的元素。掌握位运算能帮助开发者深入理解JDK源码,编写更高效的代码。

weixin_30568591的博客 408

java bitset javadoc_Java数据结构: java.util.BitSet源码学习

接着上一篇Blog:一道面试题与Java位操作 和 BitSet 库的使用,分析下Java源码中BitSet类的源码。位图(Bitmap),即位(Bit)的集合,是一种常用的数据结构,可用于记录大量的0-1状态,在很多地方都会用到,比如Linux内核(如inode,磁盘块)、Bloom Filter算法等,其优势是可以在一个非常高的空间利用率下保存大量0-1状态。在Java中,直接面向程序员的最小...

weixin_29522501的博客 265

java中的BitSet使用详解

Java中的BitSet类是一个高效的位操作工具类,用于表示可动态扩展的位向量。它具有动态扩容、空间效率高(每位仅占1bit)等特点,但不支持线程安全。基础操作包括设置/清除位、获取状态和翻转位,支持各种位运算(与/或/异或等)。BitSet适用于海量数据标记、集合运算、布隆过滤器等场景,相比boolean数组显著节省内存(1000元素仅需125字节)。使用时需注意索引越界、自动扩容等问题,多线程环境可考虑ConcurrentBitSet。通过合理使用BitSet,能在空间效率和性能间取得良好平衡。

技术人集结地 1259

Java位运算实战:性能优化与高频面试题解析

位运算作为计算机基础运算之一,直接操作二进制位实现高效计算。其核心原理是通过与、或、异或等七种运算符对二进制数进行位级操作,相比传统算术运算具有显著性能优势。在Java开发中,位运算常用于性能优化、加密算法、图形处理等场景,也是技术面试的高频考点。通过位运算可以实现快速奇偶判断、变量交换等操作,在HashMap哈希优化、ThreadLocal魔数设计等JVM底层都有典型应用。掌握位运算不仅能提升代码效率,更能深入理解计算机系统底层原理,是Java开发者进阶必备技能。

weixin_34090562的博客 354

JavaJDK源码面试题:JVM类加载过程与双亲委派模型深度解析

Java BitSet通过精妙的位运算和long数组设计,在空间和时间效率上达到了卓越的平衡。极致的内存效率:8倍于boolean数组的压缩存储高性能的批量操作:字级并行处理,充分利用CPU特性算法级优化:基于硬件指令的极致优化随着大数据和实时处理需求的增长,BitSet在以下场景具有重要价值:- 实时监控系统的事件标记- 大规模用户行为分析- 实时推荐系统的快速过滤- 数据库查询优化掌握BitSet的底层机制,不仅能够写出更高效的代码,更能深入理解位运算在系统优化中的强大威力。

2509_93908581的博客 329

从BitMap到布隆过滤器:图解位运算在数据处理中的妙用(附Java代码)

本文深入解析了从BitMap到布隆过滤器的位运算数据结构,通过Java代码示例展示了如何高效处理海量数据。BitMap以其极低的内存消耗和快速查询特性,适用于用户画像、时间序列数据压缩等场景;而布隆过滤器则通过多哈希函数降低误判率,广泛应用于大规模数据过滤。文章还详细介绍了Java BitSet的实现细节和工业级布隆过滤器的优化技巧。

kotlin6android的博客 161

java bitset bitmap,BitMap 详解

问题引入我有40亿个无序int类型的整数,再给一个新的整数,我需要判断新的整数是否在40亿个整数中,你会怎么做?问题分析最常规直观的解法,就是使用一个HashSet,将所有数都add进去,然后对要判断的数,执行一下contains函数判断下就ok了。但是思考一下,这个解法有可行性吗?考虑一下这么做的话,这个HashSet会占用多少内存?正常一个int整数,占用4个字节。40亿个整数的话,就是 4,...

weixin_33492955的博客 738
上一篇: netty-对象池实现Recycler用法测试
下一篇: 为什么要进行内存对齐以及对齐规则
lhever_
博客等级 码龄14年 213粉丝 130原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值