Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计数运行/一套1';是二进制数_C#_Bitwise Operators - Fatal编程技术网

C# 计数运行/一套1';是二进制数

C# 计数运行/一套1';是二进制数,c#,bitwise-operators,C#,Bitwise Operators,我想用位运算符计算二进制序列中1的运行次数 我搜索过类似的主题,但找到了不同的答案。汉明重量也不同,因为它计算二进制中1的数量 例如,如果我有二进制001101011101,我应该有4次1的运行,因为它们是1的集合/组除以它们之间的0 我知道如何在C#中使用逐位运算符,但我不能在一个程序中集体使用它们。转换所有的位。这样做32次,每次分析第一位。它变为1,组数增加。如果位变为0,则可以启动一个新组 bool found = false; int numberOfGroups = 0; int b

我想用位运算符计算二进制序列中1的运行次数

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

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


我知道如何在C#中使用逐位运算符,但我不能在一个程序中集体使用它们。

转换所有的位。这样做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;
}
boolfound=false;
int numberOfGroups=0;
int位=0x035D;
对于(int i=0;i<32;i++)
{
int位=位&1;
如果(!found&&bit==1)
{
numberOfGroups++;
发现=真;
}
else if(找到位&&bit==0)
{
发现=错误;
} 
位>>=1;
}

如果您有二进制数的字符串表示形式,则只需在“0”上拆分字符串:

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

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

在一系列的1中,最左边的1的属性是每次运行只出现一次,它本身就是一个1,它的左边有一个零(或者没有,但这是一个隐含的零)

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

uint leftmost = x & ~(x >> 1);
然后,可以使用任何位计数算法对这些数据进行计数


当然,每组中最右边的人也可以做同样的事情。

到目前为止你都做了哪些尝试?你能给出一个代码示例吗?一个具体的问题是二进制是如何表示的,它是字符串、uint等吗?二进制是如何给出的?智力?字符串?二进制将是无符号整数ulong/uint。
Split
返回数组,因此我们可以使用
Length
属性来调用函数
Count
@Grundy确实可以。就我个人而言,我更喜欢
Count
,因为它可读性更好,但这实际上只是一种观点。这个答案基于二进制数存储在字符串中的错误假设。我认为二进制数存储在一个类似于
int
long
的数字中,因为OP是关于位运算符的。@MartinMulder,在这种情况下,OP可以执行
。ToString(2)
或类似于:-)@MartinMulder在以防万一中添加了这一点。
uint leftmost = x & ~(x >> 1);