计数二进制数中1's的运行/集合

本文关键字:运行 集合 二进制数 | 更新日期: 2023-09-27 18:16:30

我想在位运算符的帮助下计算二进制序列中1的运行次数。

我已经搜索了类似的主题,但发现与我正在寻找的不同的答案。汉明权重也不同,因为它计算二进制中1的数量。

例如,如果我有二进制001101011101,我应该运行4次1,因为它们是1的集合/组除以它们之间的0。

我知道如何在c#中使用位运算符,但我真的不能在一个程序中共同使用它们。

计数二进制数中1's的运行/集合

如果你有一个二进制数的字符串表示,那么你只需要在"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具有每次运行只出现一次的属性,它本身是1,并且它的左边有一个0(或者什么都没有,但这是一个隐含的0)

我们可以使用最后两个属性隔离所有最左边的运行:

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;
}