我正在检查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;
}
答案 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;
}