Длина самых длинных последовательных единиц в двоичном числе

Мне нужно реализовать цифровую логическую схему с логическими элементами, такими как И, ИЛИ, НЕ, СУММИТЕЛЬ (и т. д.), которая получает 8-битное двоичное число и возвращает количество самых длинных последовательных 1 на входе.

Например:

11110011 - вернет 4

10101111 - также вернет 4

01111111 - вернет 7

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

Спасибо!


person CrazyPhrog    schedule 09.12.2018    source источник
comment
Возможный дубликат Поиск последовательной битовой строки 1 или 0   -  person JJJ    schedule 09.12.2018


Ответы (1)


Я создал таблицу истинности с 256 терминами и сократил ее до 47 с помощью минимизатора Espresso:

введите здесь описание изображения

Затем я преобразовал сжатую таблицу в многоуровневую схему (слишком большую, чтобы отображается здесь как изображение). Для этого я использовал Logic Friday 1.

Можно получить более простую схему, сопоставив мою подпрограмму C# с вентилями:

private static int countConsecutiveBits(int i)
{
    int bMax = 0;
    int b = 0;

    for (int j = 0; j < 8; j++)
    {
        if (((i >> j) & 1) == 1)
        {
            b++;
            if (bMax < b)
            {
                bMax = b;
            }
        }
        else
        {
            b = 0;
        }
    }

    return bMax;
}

Это будет включать сумматоры и компараторы, как указано в вашем вопросе.

Следующая схема — созданная вручную и не проверенная — представляет собой битовый срез, который принимает в качестве входных данных максимальное количество битов на данный момент, текущее количество битов и соответствующий бит. Выходными данными являются новое максимальное количество битов и текущее количество битов. Все счетчики имеют ширину 4 бита. Это может быть оптимизировано для первых срезов, где количество меньше.

введите здесь описание изображения

person Axel Kemper    schedule 10.12.2018