Подсчет запусков / наборов 1 в двоичном числе

Я хочу посчитать серии 1 в двоичной последовательности с помощью побитовых операторов.

Я искал похожие темы, но нашел разные ответы от того, что я ищу. Вес Хэмминга также отличается, так как он учитывает количество единиц в двоичном коде.

Например, если у меня есть двоичный код 001101011101, у меня должно быть 4 прогона 1, поскольку они представляют собой наборы / группу 1, разделенные на 0 между ними.

Я знаю, как использовать побитовые операторы в C#, но я не могу использовать их в одной программе.

3 ответа

Если у вас есть строковое представление вашего двоичного числа, то вам просто нужно разделить строку на "0":

var binaryString = "0011011101110001";

var count = binaryString
    .Split(new [] { '0' }, StringSplitOptions.RemoveEmptyEntries)
    .Count();

Если ваш номер хранится в int тогда просто преобразовать в строку:

int value = 12345;
var binaryString = Convert.ToString(value, 2);

Крайний левый 1 в ряду единиц обладает свойствами, которые встречаются ровно один раз за цикл, он сам является 1, и слева от него есть ноль (или ничего, но это подразумеваемый ноль).

Мы можем выделить все левые из прогонов, используя два последних свойства:

uint leftmost = x & ~(x >> 1);

И затем те могут быть подсчитаны с использованием любого алгоритма подсчета битов.

Разумеется, то же самое можно сделать и с самыми правыми членами каждой группы.

Сдвинь хоть все биты. Сделайте это 32 раза и проанализируйте первый бит каждый раз. Это становится 1, количество групп увеличивается. Если бит становится 0, новая группа может начаться.

bool found = false;
int numberOfGroups = 0;
int bits = 0x035D;
for(int i = 0; i < 32; i++)
{
    int bit = bits & 1;
    if (!found && bit == 1) 
    {
        numberOfGroups++;
        found = true;
    }
    else if (found && bit == 0) 
    {
       found = false;
    } 
    bits >>= 1;
}
Другие вопросы по тегам