所以,这是我的看法...
基本上,这使用List#subList 创建主二进制数组的子列表。每个子列表最多包含 8 个值...
int length = Math.min(8, bits.size());
List<Integer> byteList = bits.subList(0, length);
然后我反转这个列表,你很容易反转for-loop的顺序,这对我来说似乎更简单......
Collections.reverse(byteList);
然后我使用一个简单的for-loop 循环遍历子列表。对于1 的每个位,我只需将其二进制等效项 (Math.pow(2, index)) 添加到结果值中
for (int index = 0; index < byteList.size(); index++) {
int bit = byteList.get(index);
if (bit == 1) {
int pos = (int)Math.pow(2, index);
value += pos;
}
}
然后我删除主列表的前 n 个值并继续,直到没有任何剩余...
然后这将打印...
Word = 00000101 = 5; 0x05
Word = 01000011 = 67; 0x43
Word = 10011101 = 157; 0x9d
可运行示例...
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test100 {
public static void main(String[] args) {
List<Integer> bits = new ArrayList<Integer>(25);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(1);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(1);
bits.add(1);
bits.add(0);
bits.add(0);
bits.add(1);
bits.add(1);
bits.add(1);
bits.add(0);
bits.add(1);
System.out.println();
while (bits.size() > 0) {
int length = Math.min(8, bits.size());
List<Integer> byteList = bits.subList(0, length);
Collections.reverse(byteList);
int value = 0;
StringBuilder binary = new StringBuilder(8);
for (int index = 0; index < byteList.size(); index++) {
int bit = byteList.get(index);
if (bit == 1) {
int pos = (int)Math.pow(2, index);
value += pos;
}
binary.insert(0, bit);
}
System.out.println("Word = " + binary + " = " + value + "; 0x" + pad(2, Integer.toHexString(value)));
int size = Math.max(0, bits.size());
bits = bits.subList(length, size);
}
}
public static String pad(int length, String value) {
StringBuilder zeros = new StringBuilder(value);
while (zeros.length() < length) {
zeros.insert(0, "0");
}
return zeros.toString();
}
}