Сравнение набора битов в байтовом массиве - PullRequest
0 голосов
/ 10 февраля 2010

У меня есть байтовый массив, как показано ниже:

byte[] array = new byte[] { 0xAB, 0x7B, 0xF0, 0xEA, 0x04, 0x2E, 0xF3, 0xA9};

Задача - найти количество вхождений '0xA' в нем. Не могли бы вы посоветовать, что делать? Ответ 6.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2010

Итак, из вашего комментария вам нужно общее количество появлений битовой комбинации 1010 в байтах в вашем массиве.

Для данного байта b счет является суммой

(b & 0x0A) == 0x0A ? 1 : 0
(b & 0x14) == 0x14 ? 1 : 0
(b & 0x28) == 0x28 ? 1 : 0
(b & 0x50) == 0x50 ? 1 : 0
(b & 0xA0) == 0xA0 ? 1 : 0

(оставлено как упражнение: что это делает?)

Поместите это в функцию, вызовите ее для каждого байта в массиве, суммируйте результаты.

0 голосов
/ 10 февраля 2010

Если вы рассматриваете весь массив как одну битовую строку:

0xAB,    0x7B,    0xF0,    0xEA,    0x04,    0x2E,    0xF3,    0xA9 is then:
10101011 01111011 11110000 11101010 00000100 00101110 11110011 10101001
====                         ====                              ====
  ====                         ====                              ====

1010 встречается 6 раз.

Если вы не пытаетесь сопоставить границы байтов, вы можете попробовать что-то вроде следующего (протестировано в Perl и переведено вручную):

int counter = 0;
for (int i = 0; i < array.length; ++i)
{
    for (int bits = 0xA0, mask = 0xF0; bits >= 0x0A; bits >>= 1, mask >>= 1)
    {
        if ((array[i] & mask) == bits)
            ++counter;
    }
}

Чтобы соответствовать границам байтов, вы должны сдвинуть биты со следующего байта. Попробуйте что-то вроде этого (проверено на Perl и переведено вручную):

int counter = 0;
byte tester = array[0];

for (int i = 1; i < array.length + 1; ++i)
{
    byte nextByte = i < array.length ? array[i] : 0;

    for (int bit = 0; bit < 8; ++bit)
    {
        if ((tester & 0xF0) == 0xA0)
            ++counter;

        tester <<= 1;
        if ((nextByte & 0x80) != 0)
            tester |= 1;

        nextByte <<= 1;
    }
}

Обе программы считают 6, поскольку в этом примере нет 1010 последовательностей через границы байтов.

...