2016-10-25 4 views
1

FATシステムテーブルを調べて、32ビット整数が期待どおりに1ビットずれているかどうかを判断する必要があります。途中で別のファイルのためにジャンプが必要な場合を除き、通常、リストされた場所は現在の場所の+1です。ディスクが破損の問題を抱えている場合、その値は通常、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

あなたが一緒に2つの値をXORすることはできません、結果はの力である場合:あなたは、これは(あなたが気にしている場合)に高速である必要があり持っているビットを変更/を破損しました2それは1ビットオフですか? – Quantic

答えて

2

あなたが変更されたビットを抽出する必要がまず第一に、これは単にXORで行うことができる。

expectedCluster^receivedValue 

を各設定ビットは差を表す:ビットが同じ(0または1)結果である場合0であるが、それらが異なる場合は1である。

ここでそれらを数えなければなりません。あなたはそれを確認することができます

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のべき乗であるかどうかを確認することが示唆あなたはHammingアルゴリズムを使用することができます

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