Java выполняет итерации битов в массиве байтов

Говоря о производительности, кавычки никогда не станут вашим узким местом, однако производительность в обоих случаях одинакова.

Если говорить о скорости кодирования, если вы используете ' для разграничения строки, вам нужно будет избегать " кавычек. Вам, скорее всего, понадобится использовать " внутри строки, например:

//JSON Objects:
var jsonObject = '{"foo":"bar"}';
//HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';

Затем я предпочитаю использовать ' для разграничения строки, поэтому мне нужно экранировать меньше символов.

32
задан Hamza Yerlikaya 23 June 2009 в 18:58
поделиться

7 ответов

Вам нужно будет написать свою собственную реализацию Iterable , которая принимает массив байтов, а затем создает Iterator значения который запомнил текущий индекс в массиве байтов и текущий индекс в текущем байте. Тогда может пригодиться такой служебный метод:

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

(где бит находится в диапазоне от 0 до 7). Каждый раз, когда вызывается next () , вам нужно увеличивать свой битовый индекс в пределах текущего байта и увеличивать индекс байта в байтовом массиве, если вы достигли «9-го бита».

It ' это не совсем сложно - но немного неприятно. Дайте мне знать, если вам нужен образец реализации ...

42
ответ дан 27 November 2019 в 20:21
поделиться
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
ответ дан 27 November 2019 в 20:21
поделиться

Я знаю, вероятно, не самый "крутой" способ сделать это, но вы можете извлечь каждый бит с помощью следующего кода.

    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

Номер бита 1 = 1

Число битов 2 = 0

Число битов 3 = 0

Число битов 4 = 1

Число битов 5 = 1

Число битов 6 = 1

Число битов 7 = 0

Число битов 8 = 0

1
ответ дан 27 November 2019 в 20:21
поделиться

В качестве альтернативы можно использовать BitInputStream, подобный тому, который вы можете найти здесь , и написать такой код:

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

(Примечание: код не содержит EOFException или Обработка исключений IOException для краткости.)

Но я бы выбрал вариант Джона Скитса и сделал бы это самостоятельно.

2
ответ дан 27 November 2019 в 20:21
поделиться

Оригинал:

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;
   }
}

Или с использованием идиом Java

for (byte b : byteArray ) {
  for ( int mask = 0x01; mask != 0x100; mask <<= 1 ) {
      boolean value = ( b & mask ) != 0;
  }
}
9
ответ дан 27 November 2019 в 20:21
поделиться

Мне требовалась потоковая передача битов в моем приложении. Здесь вы можете найти мою реализацию BitArray. Это не настоящий шаблон итератора, но вы можете запросить 1-32 бита из массива потоковым способом. Также есть альтернативная реализация под названием BitReader позже в файле.

0
ответ дан 27 November 2019 в 20:21
поделиться

Вы можете перебирать байтовый массив, и для каждого байта использовать побитовые операторы для перебора его битов.

0
ответ дан 27 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: