C# 在处理琴弦和短裤时,使用一种更快的方法来应用一点遮罩?

C# 在处理琴弦和短裤时,使用一种更快的方法来应用一点遮罩?,c#,mask,bit,C#,Mask,Bit,我有下面的代码位,它将接受一个字符串以及一个位掩码。它将掩码应用于某个字的某个块(由startWord、highBit和length指定),然后如果掩码匹配,则返回true或false值 它能工作,但不是很快。肯定有办法做得更好吗 编辑: 为了澄清,highBit和length用于缩短单词的长度。如果我们有一个单词是dec:37,那么二进制是0b100101。如果它的高位为2,长度为2,那么我们只关心将掩码应用于最后两位(01)。如果它的高位为3,长度为2,则它将是方括号中的数字:0b100[1

我有下面的代码位,它将接受一个字符串以及一个位掩码。它将掩码应用于某个字的某个块(由startWord、highBit和length指定),然后如果掩码匹配,则返回true或false值

它能工作,但不是很快。肯定有办法做得更好吗

编辑:

为了澄清,highBit和length用于缩短单词的长度。如果我们有一个单词是dec:37,那么二进制是0b100101。如果它的高位为2,长度为2,那么我们只关心将掩码应用于最后两位(01)。如果它的高位为3,长度为2,则它将是方括号中的数字:0b100[10]1等

它可以有效地检查掩码中设置的任何位是否也在相应位置的相应字中设置

进一步编辑:

如果我们有单词37(0b100101)和掩码(0b1),并且我们对整个单词感兴趣(因此高位为15,长度为16),那么这将计算为真。如果掩码为0b0,那么它也将计算为true(我们只是寻找已设置的位)

掩码的长度应始终大于所分析单词部分的“长度”

  public bool AddMask(string maintMessage, short mask, int startWord, int highBit, int length)
    {            
        // Maintenance message is a string of decimal 16-bit values 
        // seperated by semi-colons.
        var splitMsg = maintMessage.Split(';');
        var word = splitMsg[startWord];
        return AddMask(short.Parse(word), mask, highBit, length);            
    }


    public bool AddMask(short wordToMask, short mask, int highBit, int length)
    {

        if (highBit < length)
            length = highBit; // Or throw an exception?

        var binWord = Convert.ToString(wordToMask, 2);
        if (length > binWord.Length) // Shorten 'length' to max possible length
            length = binWord.Length;

        binWord = binWord.Substring(binWord.Length - highBit, length);

        var shortWord = Convert.ToInt16(binWord, 2);

        var result = shortWord & mask;
        return result == mask;
    }
public bool AddMask(字符串maintMessage、短掩码、int-startWord、int-highBit、int-length)
{            
//维护消息是十进制16位值的字符串
//用分号分隔。
var splitMsg=maintMessage.Split(“;”);
var word=splitMsg[startWord];
返回AddMask(short.Parse(word)、mask、highBit、length);
}
公共bool AddMask(短字掩码、短掩码、整数高位、整数长度)
{
if(高位<长度)
length=highBit;//还是引发异常?
var binWord=Convert.ToString(wordToMask,2);
if(length>binWord.length)//将“length”缩短到最大可能长度
长度=binWord.length;
binWord=binWord.Substring(binWord.Length-高位,长度);
var shortWord=Convert.ToInt16(binWord,2);
var结果=短词和掩码;
返回结果==掩码;
}

如果我理解正确,您真正想说的是,当且仅当
字掩码
值中的每个位都设置在
掩码
中设置相同位的对应位置时,该方法才应返回
true
,限定
掩码
值应与要检查的位组对齐

如果是这样的话,那么你的问题可以归结为如下简单的问题:

bool AddMask(short wordToMask, short mask, int highBit, int length)
{
    return mask == ((wordToMask >> (highBit - length)) & mask);
}
换句话说,将原始数据向右移动,以便要检查的位从0开始–即与
掩码对齐
–然后执行逐位
&
,查看结果是否与
掩码一致。如果
掩码
中的任何位未在
字掩码
中设置,它们将被设置为0,结果将不匹配。否则,它会

我应该注意到,从1开始对位进行编号有点不合常规。与数组一样,位通常从0开始索引。但是上面的描述与你的描述相符;如果<代码> HaveBue/COD>为2,<代码>长度<代码>为2,那么您只需要考虑两个最低位。

上面还假设
掩码
不会在不重要的位置设置位。如果不是这样的话,那么您必须添加更多的代码来屏蔽您想要忽略的更高位。看起来更像这样:

bool AddMask(short wordToMask, short mask, int highBit, int length)
{
    // Shift the word to align with the mask
    short result = (short)(wordToMask >> (highBit - length)),
        resultMask = (short)((1 << highBit) - 1);

    // Clear all the bits higher than highBit
    result &= resultMask;

    // Compare with the mask
    return (resultMask & mask) == (result & mask);
}
bool AddMask(短字掩码、短掩码、整数高位、整数长度)
{
//移动单词以与遮罩对齐
short result=(short)(wordToMask>>(高位-长度)),

结果任务=(短)((1)我不清楚你想要达到什么,或者字符串与它有什么关系。你能给出样本输入和预期输出吗?我不希望需要任何文本操作……代码的目的是什么?splitMsg的var因为你知道它会返回什么,word wich也会返回一个字符。如果你知道返回什么,就尽量避免var。我对这个问题做了进一步的解释,但你说得很对Jim。Thealon,我总是使用var而不是类型-这只是个人的偏好。ReSharper实际上是通过de建议的错误。你的答案非常有用。你的答案非常有用。谢谢!