So, here's my take on it...
Basically, this uses List#subList
to create a sub list of the main binary array. Each sublist contains up to 8 values...
int length = Math.min(8, bits.size());
List<Integer> byteList = bits.subList(0, length);
I then reverse this list, you easily reverse the for-loop
order, this just seem simpler to me...
Collections.reverse(byteList);
Then I use a simple for-loop
to loop through the sub list. For each bit that is 1
, I simply add it's binary equivalent (Math.pow(2, index)
) to the resulting value
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;
}
}
Then I remove the first n values the master list and continue until there is nothing left...
This will then print...
Word = 00000101 = 5; 0x05
Word = 01000011 = 67; 0x43
Word = 10011101 = 157; 0x9d
Runnable example...
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();
}
}