【问题标题】:How to convert short array to BitSet with 2 bit precision in Java?如何在 Java 中以 2 位精度将短数组转换为 BitSet?
【发布时间】:2022-01-10 19:57:27
【问题描述】:

我有一个短数组 {0,2,3,1,…},我想将其转换为 BitSet。

位集中的预期位:00 10 11 01 …

bitset 中的每两个位都应该代表一个短路。 (2 位精度) 这对于短值 (0,1,2,3) 应该可以正常工作。

我知道我可以使用 ByteBufferBitSet 来访问数字的位,但这些位被格式化为 2 个字节(16 位)。我假设我需要对值进行位移才能访问正确的位,但我不知道如何。

int nBit = 0;
BitSet result = new BitSet();
for (int i = 0; i < numbers.length; i++) {
  ByteBuffer buffer = ByteBuffer.allocate(2);
  buffer.putShort(number);
  BitSet bits = BitSet.valueOf(buffer.array());

  result.set(nBit++, bits.get(?));
  result.set(nBit++, bits.get(?));
}

也许有更简单的方法?

【问题讨论】:

  • 为什么不使用字节而不是位集?你只需要 8 位...
  • 数组不限于4个数字。我已经更新了问题以使这一点更清楚。
  • 你见过BitSet.valueOf(byte[] bytes)BitSet.valueOf(long[] longs)吗?

标签: java bytebuffer bitset


【解决方案1】:

我目前的务实解决方案可能没问题,因为只需要处理 4 个值:

public static BitSet transformToBitSet(short[] numbers) {
        BitSet data = new BitSet();
        int nBit = 0;
        for (int i = 0; i < numbers.length; i++) {
            short number = numbers[i];
            switch (number) {
            case 0:
                data.set(nBit++, false);
                data.set(nBit++, false);
                break;
            case 1:
                data.set(nBit++, true);
                data.set(nBit++, false);
                break;
            case 2:
                data.set(nBit++, false);
                data.set(nBit++, true);
                break;
            case 3:
                data.set(nBit++, true);
                data.set(nBit++, true);
                break;
            default:
                throw new RuntimeException("Invalid number encountered. Can't map values >4");
            }
        }
        return data;
    }

【讨论】:

  • 你的位是倒退的。 1 应该设置最低位,2 应该设置第二位。
  • 你能详细说明一下吗?我通过Integer.parseInt("01", 2) == 1 对此进行了测试
  • parseInt() 首先读取最高有效数字。在01 中,1 是低位,0 是高位。
【解决方案2】:

这是一种方法。

  • 设置所需的bitLength(用于在左侧填充零位);
  • 将 BitSet 索引初始化为 0。
  • 对值进行迭代。
  • 将每个转换为位串。
  • 在左侧填充以达到所需的位长度
  • 然后根据位的数值设置位
BitSet b = new BitSet();
short[] vals = { 0, 2, 3, 1 };


int bitLength = 2;
int idx = 0;
for (short v : vals) {
    String bits = Integer.toBinaryString(v);
    bits = "0".repeat(bitLength - bits.length())+bits;
    for (char c : bits.toCharArray()) {
        b.set(idx++, c - '0' == 1);
    }
}
System.out.println(b)

打印

2,4,5,7

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 2018-04-01
    • 2011-01-02
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多