繁体   English   中英

我们在哪里使用 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 类带有类似于按位运算符的方法。 它比普通的二进制类型更灵活。

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

  • byte[] 数组
  • 位数

我的第一个解决方案是返回一个布尔数组。 这个数组的内容是二维码像素,数组长度的平方根就是边长。 当然这行得通,但我觉得浪费了,因为它应该是一系列位。 我的下一次尝试是返回Pair<int, byte[]>对象,经过大量拉扯后,我无法使其在 C++ 中工作。 这里是BitSet(145)构造。 通过返回这个BitSet对象,我传达了上面列出的两种类型的信息。 但有一个小技巧 如果二维码像素总共有 144 个像素,因为一侧是 12,那么你必须分配BitSet(145)并执行obj.set(144) 也就是说,我们引入了一个我们随后设置的人工最后一位,但最后一位不是二维码像素的一部分。 这可确保BitSet::length()正确返回位计数。 所以在 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[] ,它实际上是一个动态大小的位掩码。 本质上,它不是使用boolean s 来存储值,而是使用long s,其中long s 64 位中的每一个都用于存储单个位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM