原理解析
在c/c++里面任何数和0取&都是0,任何数和1取&都不变,所以直接将校验数第n位置0,其他位置1,在和给定数字取&即可。
代码实现
以32无符号整型为例:
#include <iostream>
uint32_t GetCheckNum(uint16_t index)
{
switch (index)
{
case 1: return 0x7FFFFFFF;
case 2: return 0xBFFFFFFF;
case 3: return 0xDFFFFFFF;
case 4: return 0xEFFFFFFF;
case 5: return 0xF7FFFFFF;
case 6: return 0xFBFFFFFF;
case 7: return 0xFDFFFFFF;
case 8: return 0xFEFFFFFF;
case 9: return 0xFF7FFFFF;
case 10: return 0xFFBFFFFF;
case 11: return 0xFFDFFFFF;
case 12: return 0xFFEFFFFF;
case 13: return 0xFFF7FFFF;
case 14: return 0xFFFBFFFF;
case 15: return 0xFFFDFFFF;
case 16: return 0xFFFEFFFF;
case 17: return 0xFFFF7FFF;
case 18: return 0xFFFFBFFF;
case 19: return 0xFFFFDFFF;
case 20: return 0xFFFFEFFF;
case 21: return 0xFFFFF7FF;
case 22: return 0xFFFFFBFF;
case 23: return 0xFFFFFDFF;
case 24: return 0xFFFFFEFF;
case 25: return 0xFFFFFF7F;
case 26: return 0xFFFFFFBF;
case 27: return 0xFFFFFFDF;
case 28: return 0xFFFFFFEF;
case 29: return 0xFFFFFFF7;
case 30: return 0xFFFFFFFB;
case 31: return 0xFFFFFFFD;
case 32: return 0xFFFFFFFE;
default: return 0xFFFFFFFF;
}
}
int main(void)
{
uint32_t num = 0xFFFFFFFF;
for (int i = 1; i < 33; i++)
{
num = num & GetCheckNum(i);
std::cout << "i = " << i << " " << std::hex << num << std::endl;
}
std::cin >> num;
return 0;
}