Подсчет запусков / наборов 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;
}