使用按位运算检查变量中位的最快方法是什么?

例如,我有一个短变量(2个字节= 16位):(在我的项目中,这是00、01和10的序列)

0001010101101001 = 0001.0101|0110.1001

我想检查此变量是否包含位序列,例如,我需要'01010101'(这是4 x 01)。

最快的检查方法是什么? 我找到了一些解决方案,但我确信存在更简单,更快速的解决方案。

(pseudocode)
var =  0001010101101001;
need = 0000000001010101;
for(int i=0;i<4;i++)
{
     if(var&need==need)
           return 1;
     else
           var = var >> 2;
}

或:

(pseudocode)
var =   0001010101101001;
need1 = 0000000001010101;
need2 = 0000000101010100;
need3 = 0000010101010000;
need4 = 0001010101000000;
need5 = 0101010100000000;
if(var&need1==need1) return 1;
if(var&need2==need2) return 1;
if(var&need3==need3) return 1;
if(var&need4==need4) return 1;
if(var&need5==need5) return 1;
else return 0;
hf226 回答:使用按位运算检查变量中位的最快方法是什么?

还有另一种方式:

var &= 0101010101010101
var &= var >> 2
var &= var >> 4
return var != 0

奇数位无关紧要,因此请在第一步中将其删除。

然后,将每4个相邻的“块”(每个2位)分两步进行“与”运算,首先将每个块直接与块的左侧对齐,然后通过距离2个块的相同操作来复合。因此,结果是掩盖了是否从该位置开始以4个“ 01”开始的序列。

最后,只需检查该掩码中是否设置了任何位即可。

,

您的第一个解决方案是好的:

for (int Count = 0; Count < 4; Count++)
{
    if ((Var & Need) == Need)
        Found = true;
    else
        Var = (UInt16)(Var >> 2);   
}

我实际上使事情变得复杂而不是简化。

这是使用蒙版的替代解决方案。

using System;

public class Program
{
    public static void Main()
    {
        UInt16 Var = 0x1569;    //0001010101101001 0x1569
        UInt16 Need = 0x5A;     //0000000001011010 0x5A
                                //0000000001010101 0x55
                                //0000000001010110 0x56 
        UInt16[] Mask = { 0x00FF,0x03FC,0x0FF0,0x3FC0,0xFF00 };

        bool Found = false;
        for (int Count = 0; Count < 4; Count++)
            Found |= (((Var & Mask[Count]) ^ (Need << (Count + Count))) == 0);

        Console.WriteLine(Found);                
    }
}
本文链接:https://www.f2er.com/2958413.html

大家都在问