Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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++ 如何检查字节是否包含特定的位模式?_C++_Math - Fatal编程技术网

C++ 如何检查字节是否包含特定的位模式?

C++ 如何检查字节是否包含特定的位模式?,c++,math,C++,Math,起初我只是想知道有多少8位数字包含111或000,但我找不到任何基于数学的答案,但也找不到任何答案。可能是因为我说得不对 现在我只想知道如何用一个算法来检查,我在C++中尝试过,因为最近我学会了。 到目前为止,我已经做到了: int count = 0; unsigned char base = 0; //for every permutation of origin for (unsigned short i = 0; i < 0b100000000;

起初我只是想知道有多少8位数字包含111或000,但我找不到任何基于数学的答案,但也找不到任何答案。可能是因为我说得不对

现在我只想知道如何用一个算法来检查,我在C++中尝试过,因为最近我学会了。 到目前为止,我已经做到了:


    int count = 0;
    unsigned char base = 0;

    //for every permutation of origin
    for (unsigned short i = 0; i < 0b100000000; i++)
    {
        bool hasPattern = false;
        unsigned char pattern = 0b1110000;
        unsigned char temp = base;

        //for as many times as (length of base)-(length of pattern)
        for (char j = 0; j < 5; j++)
        {
            //get rid of the bits we aren't checking
            temp >>= j;
            temp <<= 5;
            //check if what remains matches our pattern
            if ((pattern & temp) == pattern || (~pattern & temp) == ~pattern)
            {
                hasPattern = true;
            }
        }
        //if the pattern matches, increment count
        count += hasPattern;

        base++;
    }

    std::cout << count << std::endl;


整数计数=0;
无符号字符基=0;
//对于起源的每个排列
对于(无符号短i=0;i<0b100000000;i++)
{
bool-hasPattern=false;
无符号字符模式=0b1110000;
无符号字符温度=基;
//与(底座长度)-(图案长度)的次数相同
对于(字符j=0;j<5;j++)
{
//把我们没有检查的东西处理掉
温度>>=j;

在代码中,
temp
中的5个低位始终为0,而
模式中的4个低位始终为0

但实际上,你应该分开面具和图案,就像

unsigned char mask = 0b0000'0111; // (1 << pattern length) - 1
unsigned char pattern1 = 0b0000'0111;
unsigned char pattern2 = 0b0000'0000;

temp >>= j;
if ((mask & temp) == pattern1 || (mask & temp) == pattern2)
无符号字符掩码=0b0000'0111;//(1>=j;
if((遮罩和温度)==pattern1 | |(遮罩和温度)==pattern2)
这样,您就可以检查任何子序列


此外,循环应该包含到5:模式可以出现在位(0,1,2),(1,2,3),…,(5,6,7).

你甚至从来没有看过
i
,这是你应该测试的数字。相反,你看的是
base
,它被初始化为零,之后再也没有改变过。@IgorTandetnik我也这么认为,但是
base
在循环的底部是递增的。考虑到它是只有256个可能的值,您可以简单地预计算其中哪一个包含必需的位模式,创建一个256个值的数组,指示每个值是否具有位模式,然后在这一点上,整个问题就变成了一个零汉堡。在这种情况下,您是在寻找一行中3 1的任何序列吗?或者特别是
0b11100000?@JohnFilleau任意三个1或0