为什么通过在Java中将字节数组转换为BitSet来获得错误的位表示

问题描述 投票:0回答:2

我试图转换一个字节数组,以便使用它的位表示。

输入:

byte[] values = new byte[]{21, 117, 41, -1};

我想从字节数组创建一个BitSet对象,但我将其拆分以调查问题,并尝试从数组的每个元素创建多个BitSet对象。

BitSet对象按以下方式创建:

BitSet bitSetTwentyOne = BitSet.valueOf(new byte[]{21});
BitSet bitSetOneHundredSevenTeen = BitSet.valueOf(new byte[{117});
BitSet bitSetFourtyOne = BitSet.valueOf(new byte[]{41});
BitSet bitSetMinusOne = BitSet.valueOf(new byte[]{-1});

使用以下方法打印出这些位:

private String getBits(BitSet bitSet) {
    StringBuilder bitsBuilder = new StringBuilder();

    for (int i = 0; i < bitSet.length(); i++) {
        bitsBuilder.append(bitSet.get(i) == true ? 1 : 0);
    }

    return bitsBuilder.toString();
}

输出:

bitSetTwentyOne: 10101 but expected -> 00010101 (BitSet::length = 5)
bitSetOneHundredSevenTeen: 1010111 but expected -> 01110101 (BitSet::length = 7)
bitSetFourtyOne: 100101 but expected -> 00101001 (BitSet::length = 6)
bitSetMinusOne: 11111111 but it is as expected at least (BitSet::length = 8)

即使需要填充零,我希望所有值都是8位宽度。我不明白为什么在转换117和41时它会给出错误的二进制值。

java bitset
2个回答
2
投票

看来你正在向后打印这些位。请注意您的输出(所需的前导零除外)是您预期输入的镜像。

使用你的代码,传入4,应该是100,我得到001。似乎位0是最低有效位,而不是最重要的位。要纠正这个问题,请向后循环索引。 -141除了领先的零之外是正确的原因是它们的bitset表示是回文。

要添加前导零,从length()中减去8并打印多个零。 length()方法仅返回表示数字所需的位数。你需要自己编写代码;前导零没有BitSet功能。


3
投票
  • length()使用最高位1提供逻辑长度。
  • size()会给8。
  • cardinality()会给出比特1的数量。

所以你应该使用size()

然后这些位采用小端格式,并通过先输出0来反转它。

private String getBits(BitSet bitSet) {
    StringBuilder bitsBuilder = new StringBuilder();
    for (int i = 0; i < bitSet.size(); ++i) {
        bitsBuilder.insert(0, bitSet.get(i) ? '1' : '0');
    }
    return bitsBuilder.toString();
}
© www.soinside.com 2019 - 2024. All rights reserved.