簡體   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