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

时间:2017-06-10 19:18:23

标签: java bitset

我刚刚发现java中有BitSet。已有数组和类似的数据结构。 BitSet可以在哪里使用?

3 个答案:

答案 0 :(得分:3)

看看这个:

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

BitSet是位向量。列表中的每个条目都是true(1)或false(0)。 BitSet类带有类似于按位运算符的方法。它比普通二进制类型更灵活一点。

答案 1 :(得分:2)

由于上述答案仅说明了BitSet是什么,因此我在这里提供有关如何使用BitSet及其原因的答案。起初,我不知道BitSet构造存在。我有一个C ++中的QR码生成器,出于灵活的原因,我不想在将此QR码返回给调用者时使用特定的位图结构。 QR码只是黑白的,可以表示为一系列位。问题是在JNI C ++中,我必须返回代表这些位系列的字节数组,然后我必须返回位的计数。请注意,仅字节数组的大小无法分辨位数。实际上,我面对的情况是我的JNI C ++必须返回两个值:

  • byte []数组
  • 位数”

我的第一个解决方案是返回一个布尔数组。该数组的内容是QR Code像素,数组长度的平方根是边的长度。当然可以,但是我感到浪费,因为它应该是一系列的东西。我的下一个尝试是返回Pair<int, byte[]>对象,经过大量的努力,我无法使其在C ++中工作。 BitSet(145)结构在这里。通过返回这个BitSet对象,我传达了上面列出的两种信息。 但是有一个小技巧。如果QR码像素总共有144个像素,因为一侧为12,则必须分配BitSet(145)并执行obj.set(144)。也就是说,我们引入了人工设置的最后一位,但该最后一位不属于QR码像素。这样可以确保BitSet::length()正确返回位数。所以在科特林:

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

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

答案 2 :(得分:0)

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