[英]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寬度,即使需要用零填充也是如此。 我不明白為什么在轉換117和41時會給出錯誤的二進制值。
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
是最低有效位,而不是最高有效位。 若要更正此問題,請向后遍歷索引。 -1
和41
與前導零分開是正確的原因是它們的位集表示是回文。
要在前導零之前添加數字,請從8
減去length()
並輸出那么多零。 length()
方法僅返回表示該數字所需的位數。 您需要自己編寫代碼; 沒有用於前導零的BitSet
功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.