繁体   English   中英

为什么在Java中将字节数组转换为BitSet会得到错误的位表示形式

[英]Why is wrong bit representation got by converting byte array to BitSet in Java

我尝试转换字节数组以使用其位表示形式。

输入:

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)

我需要所有值8bit宽度,即使需要用零填充也是如此。 我不明白为什么在转换11741时会给出错误的二进制值。

  • 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();
}

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

使用您的代码,传入4 ,应该是100 ,我得到001 看来位0是最低有效位,而不是最高有效位。 若要更正此问题,请向后遍历索引。 -141与前导零分开是正确的原因是它们的位集表示是回文。

要在前导零之前添加数字,请从8减去length()并输出那么多零。 length()方法仅返回表示该数字所需的位数。 您需要自己编写代码; 没有用于前导零的BitSet功能。

暂无
暂无

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

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