我们在哪里使用 BitSet,为什么在 java 中使用它?

Where do we use BitSet and why do we use it in java?

刚刚发现java里面有BitSet。已经有数组和类似的数据结构。 BitSet可以用在什么地方?

看看这个:

https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

BitSet 是位向量。列表中的每个条目要么为真 (1),要么为假 (0)。 BitSet class 带有类似于按位运算符的方法。它比普通的二进制类型更灵活。

由于上面的回答只是解释了 BitSet 是什么,我在这里提供一个关于我如何使用 BitSet 以及为什么使用的回答。起初,我不知道 BitSet 结构的存在。我在 C++ 中有一个二维码生成器,出于灵活的原因,我不想在 return 中使用特定的位图结构将此二维码返回给调用者。 QR 码只是黑白的,可以表示为一系列位。问题是在 JNI C++ 中,我必须 return 表示这些位序列的字节数组,然后我必须 return 位的计数。请注意,字节数组的大小本身并不能说明位数。实际上,我面临的场景是我的 JNI C++ 必须 return 两个值:

  • 字节[]数组
  • 位数

我的第一个解决方案是 return 一个布尔数组。这个数组的内容是二维码的像素点,数组长度的平方根就是边的长度。当然这行得通,但我觉得浪费了,因为它应该是一系列的位。我的下一次尝试是 return Pair<int, byte[]> 对象,在费尽周折之后我无法让它在 C++ 中工作。 BitSet(145) 结构来了。通过 returning 这个 BitSet 对象,我传达了上面列出的两种信息。 不过有个小技巧。如果QR Code像素一共有144个像素,因为一边是12,那么你必须分配BitSet(145)并做obj.set(144)。也就是说,我们引入了一个人为的最后一位,然后我们进行设置,但最后一位不是 QR 码像素的一部分。这确保 BitSet::length() 正确地 return 位计数。所以在 Kotlin 中:

var pixels:BitSet = getqrpixels(inputdata)
var pixels_len = pixels.length() - 1
var side = sqrt(pixels_len.toFloat()).toInt()
drawSquareBitmap(pixels, side)

因此,这是我对这个神秘 BitSet 的意外用例。

BitSet 与 boolean[] 不同,它实际上是一个动态大小的位掩码。本质上,它不是使用 booleans 来存储值,而是使用 longs,其中每个 longs 64 位用于存储一个位。