【问题标题】:Where do we use BitSet and why do we use it in java?我们在哪里使用 BitSet,为什么在 java 中使用它?
【发布时间】:2017-06-10 19:18:23
【问题描述】:

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

【问题讨论】:

  • 定义了BitSet 的任何位置。 OT:大量的在线比较,例如boolean array vs BitSet。 “已经有数组和类似的数据结构” - 当我们可以使用int 值表示true/false 时,为什么还有boolean
  • BitSet 对于(不太大)范围内的一组非负整数非常有效。比数组和哈希映射更有效。 EnumSet 的实现方式与 BitSet 相同。
  • 链接让我无法理解,但有几次有人问如何确定两个字符串是否包含相同的字符。对于非常长的字符串,一个好的答案是为每个字符串的字符构建一个位集并比较这些位集。
  • 搜索 Stack Overflow 和其他地方的例子。

标签: java bitset


【解决方案1】:

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

  • byte[] 数组
  • 位数

我的第一个解决方案是返回一个布尔数组。这个数组的内容就是二维码像素,数组长度的平方根就是边长。当然这有效,但我觉得浪费了,因为它应该是一系列位。我的下一个尝试是返回Pair<int, byte[]> 对象,经过大量拉扯后,我无法使其在 C++ 中工作。 BitSet(145) 结构来了。通过返回这个BitSet 对象,我传达了上面列出的两种类型的信息。 但有一个小技巧。如果二维码像素总共有144个像素,因为一侧是12个,那么你必须分配BitSet(145)并做obj.set(144)。也就是说,我们引入了一个人工设置的最后一位,但最后一位不是 QR 码像素的一部分。这可确保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 是我意想不到的用例。

【讨论】:

    【解决方案2】:

    看看这个:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-07
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 2011-03-25
        • 2013-06-28
        • 2015-05-30
        • 2017-10-13
        相关资源
        最近更新 更多