与预期数字

时间:2016-10-25 15:17:50

标签: c# .net bit-manipulation

我正在检查FAT系统表,并且需要确定32位整数是否与预期相比减少了一位。通常,列出的位置是当前位置的+1,除非由于另一个文件而需要跳转。如果磁盘存在损坏问题,则该值通常会在标准之外设置为1位。我已经写了我现在正在检查的方法,但想知道是否有更简单或更快的方式来执行此功能。

internal bool CheckFatValueToIndex(int expectedCluster, int recievedValue)
{
    /*Clear one bit and compare to expected value
     *Return true if expected cluster is 1 bit off*/
    if ((expectedCluster | 0x01) == recievedValue || (expectedCluster | 0x02) == recievedValue || (expectedCluster | 0x04) == recievedValue || (expectedCluster | 0x08) == recievedValue || (expectedCluster | 0x10) == recievedValue || (expectedCluster | 0x20) == recievedValue || (expectedCluster | 0x40) == recievedValue || (expectedCluster | 0x80) == recievedValue || (expectedCluster | 0x100) == recievedValue)
        return true;
    if ((expectedCluster | 0x200) == recievedValue || (expectedCluster | 0x400) == recievedValue || (expectedCluster | 0x800) == recievedValue || (expectedCluster | 0x1000) == recievedValue || (expectedCluster | 0x2000) == recievedValue || (expectedCluster | 0x4000) == recievedValue || (expectedCluster | 0x8000) == recievedValue)
        return true;

        return false;
}

1 个答案:

答案 0 :(得分:2)

首先,您需要提取已更改的位,这可以通过XOR完成:

expectedCluster ^ receivedValue

每个设置位代表一个区别:如果位相同(0或1),则结果为0但如果它们不同则为1。

现在你必须数他们。您可以使用Hamming算法:

int CountSetBits(int x) {
    int count = 0;
    for (count = 0; x > 0; ++count)
        x &= x - 1;

    return count;
}

然后你可以检查它:

return CountSetBits(expectedCluster ^ receivedValue) > 1;

编辑:Quantic建议检查XOR数是否是2的幂,如果你不需要计算你有多少损坏的 /改变位,那么这应该更快(如果你关心的话) :

bool IsPowerOf2(int x) {
    return x != 0 && (x & (x - 1)) == 0;
}