Как можно проверить, содержит ли байт определенный c шаблон битов? - PullRequest
1 голос
/ 19 апреля 2020

Сначала я просто хотел узнать, сколько 8-битных чисел содержит либо 111, либо 000, но я не смог найти ни одного математического ответа, но не смог найти ни одного. Вероятно, потому, что я не мог сказать это правильно.

Теперь я просто хочу знать, как проверить с помощью алгоритма, я попробовал на c ++, потому что недавно изучил его. Вот где я дошел до этого:


    int count = 0;
    unsigned char base = 0;

    //for every permutation of origin
    for (unsigned short i = 0; i < 0b100000000; i++)
    {
        bool hasPattern = false;
        unsigned char pattern = 0b1110000;
        unsigned char temp = base;

        //for as many times as (length of base)-(length of pattern)
        for (char j = 0; j < 5; j++)
        {
            //get rid of the bits we aren't checking
            temp >>= j;
            temp <<= 5;
            //check if what remains matches our pattern
            if ((pattern & temp) == pattern || (~pattern & temp) == ~pattern)
            {
                hasPattern = true;
            }
        }
        //if the pattern matches, increment count
        count += hasPattern;

        base++;
    }

    std::cout << count << std::endl;

Выполнение этого возвращает 0, в то время как оно определенно должно возвращать> 0

1 Ответ

1 голос
/ 19 апреля 2020

В вашем коде 5 младших битов в temp всегда равны 0, тогда как только 4 младших бита pattern равны.

Но на самом деле вы должны разделить маску и шаблон, как

unsigned char mask = 0b0000'0111; // (1 << pattern length) - 1
unsigned char pattern1 = 0b0000'0111;
unsigned char pattern2 = 0b0000'0000;

temp >>= j;
if ((mask & temp) == pattern1 || (mask & temp) == pattern2)

Таким образом, вы можете проверять любые подпоследовательности.

Также l oop должно быть до 5 включительно : шаблон может появляться в битах ( 0, 1, 2), (1, 2, 3), ..., (5, 6, 7).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...