Java iteracja bitów w tablicy bajtów

Jak mogę iterować bity w tablicy bajtów?

Author: Hamza Yerlikaya, 2009-06-23

7 answers

Będziesz musiał napisać własną implementację Iterable<Boolean>, która pobrała tablicę bajtów, a następnie utworzyła Iterator<Boolean> wartości, które zapamiętały bieżący indeks do tablicy bajtów i bieżący indeks w bieżącym bajcie. Wtedy przydałaby się taka metoda użytkowa:

private static Boolean isBitSet(byte b, int bit)
{
    return (b & (1 << bit)) != 0;
}

(Gdzie bit waha się od 0 do 7). Za każdym razem, gdy wywołano next(), trzeba było zwiększyć indeks bitów w bieżącym bajcie i zwiększyć indeks bajtów w tablicy bajtów, jeśli osiągnięto " dziewiąty bit".

To nie jest naprawdę trudne - ale trochę boli. Daj mi znać, jeśli chcesz przykładową realizację...

 40
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:02:19
public class ByteArrayBitIterable implements Iterable<Boolean> {
    private final byte[] array;

    public ByteArrayBitIterable(byte[] array) {
        this.array = array;
    }

    public Iterator<Boolean> iterator() {
        return new Iterator<Boolean>() {
            private int bitIndex = 0;
            private int arrayIndex = 0;

            public boolean hasNext() {
                return (arrayIndex < array.length) && (bitIndex < 8);
            }

            public Boolean next() {
                Boolean val = (array[arrayIndex] >> (7 - bitIndex) & 1) == 1;
                bitIndex++;
                if (bitIndex == 8) {
                    bitIndex = 0;
                    arrayIndex++;
                }
                return val;
            }

            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }

    public static void main(String[] a) {
        ByteArrayBitIterable test = new ByteArrayBitIterable(
                   new byte[]{(byte)0xAA, (byte)0xAA});
        for (boolean b : test)
            System.out.println(b);
    }
}
 17
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 15:42:03

Oryginalny:

for (int i = 0; i < byteArray.Length; i++)
{
   byte b = byteArray[i];
   byte mask = 0x01;
   for (int j = 0; j < 8; j++)
   {
      bool value = b & mask;
      mask << 1;
   }
}

Lub używając idiomów Java

for (byte b : byteArray ) {
  for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
      boolean value = ( b & mask ) != 0;
  }
}
 9
Author: Paul Sonier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:36:39

Alternatywą byłoby użycie BitInputStream, takiego jak ten, który można znaleźć tutaj i napisać kod w następujący sposób:

BitInputStream bin = new BitInputStream(new ByteArrayInputStream(bytes));
    while(true){
        int bit = bin.readBit();
        // do something
    }
bin.close();

(uwaga: kod nie zawiera EOFException lub IOException obsługi dla zwięzłości.)

/ Align = "left" /
 2
Author: the.duckman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:19:43

Wiem, prawdopodobnie nie jest to "najfajniejszy" sposób, ale możesz wyodrębnić każdy bit za pomocą następującego kodu.

    int n = 156;

String bin = Integer.toBinaryString(n);
System.out.println(bin);

char arr[] = bin.toCharArray();
for(int i = 0; i < arr.length; ++i) {
    System.out.println("Bit number " + (i + 1) + " = " + arr[i]);
}

10011100

Liczba bitowa 1 = 1

Liczba bitowa 2 = 0

Liczba bitowa 3 = 0

Liczba bitowa 4 = 1

Liczba bitowa 5 = 1

Liczba bitowa 6 = 1

Liczba bitów 7 = 0

Liczba bitów 8 = 0

 2
Author: amischiefr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:25:33

Można iterację poprzez tablicę bajtów, a dla każdego bajtu używać operatorów bitowych do iteracji jego bitów.

 0
Author: SpaceghostAli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:02:35

Potrzebowałem trochę strumieniowania bitów w mojej aplikacji. tutaj znajdziesz moją implementację BitArray. Nie jest to prawdziwy wzorzec iteratora, ale można poprosić o 1-32 bity z tablicy w sposób strumieniowy. Istnieje również alternatywna implementacja zwana BitReader później w pliku.

 0
Author: akarnokd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-23 19:14:19