以二进制数计算运行/ 1的集合

时间:2015-10-06 17:51:39

标签: c# bitwise-operators

我想借助于按位运算符计算二进制序列中1的运行。

我搜索了类似的主题,但从我正在寻找的内容中找到了不同的答案。汉明重量也不同,因为它计算二进制数中的1的数量。

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

我知道如何在C#中使用按位运算符,但我真的无法在一个程序中集体使用它们。

3 个答案:

答案 0 :(得分:5)

如果你有二进制数的字符串表示,那么你只需要将字符串拆分为" 0":

var binaryString = "0011011101110001";

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

如果您的号码存储在int中,那么转换为字符串很简单:

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

答案 1 :(得分:2)

一组1中最左边的1具有每次运行恰好发生一次的属性,它本身就是1,并且它左边有一个零(或者没有,但是这是隐含的)零)。

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

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

然后可以使用任何位计数算法计算这些。

当然,对于每个群体中最右边的群体也可以做同样的事情。

答案 2 :(得分: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;
}