如何用按位与和按位非运算检测冗余值?代码逻辑解析求助
代码逻辑拆解与位运算说明
这段代码是通过冗余校验检测RAM数据完整性的方案:32位变量myvalue_32bit中,低16位是原始有效数据,高16位是原始数据的按位取反备份,通过对比还原后的值判断数据是否出错。
第一行:提取低16位原始数据
uint16 initial_value = (uint16)(myvalue_32bit & 0xFFFFu);
0xFFFFu是16位全1的无符号数(二进制为00000000000000001111111111111111),按位与&的作用是精准保留低16位,屏蔽高16位:
- 按位与的规则是:对应位都为1时结果为1,否则为0。所以32位数据和
0xFFFFu运算后,高16位会被全部置0,低16位完全保留原始值。 - 最后强制转换为
uint16,得到的就是我们需要的原始16位数据。
第二行:还原高16位的冗余备份
uint16 toggle_value = ~((uint16)(myvalue_32bit >>16));
这行分两步执行:
myvalue_32bit >>16:把32位数据整体右移16位,原来的高16位会移动到低16位的位置,新的高16位补0,这样就提取出了冗余备份的16位数据。~按位非运算:将提取出的备份数据每一位取反(0变1,1变0)。因为备份的是原始数据的按位取反值,所以取反后就能还原出和原始数据一致的值,方便和initial_value对比。
具体示例
假设原始16位数据是0x1234(二进制:0001001000110100),对应的冗余备份是它的按位非值0xEDCB(二进制:1110110111001011),那么32位变量myvalue_32bit就是0xEDCB1234。
- 第一行运算:
0xEDCB1234 & 0xFFFFu = 0x1234,所以initial_value = 0x1234。 - 第二行运算:
0xEDCB1234 >>16 = 0xEDCB,转成uint16后还是0xEDCB。- 按位非
~0xEDCB = 0x1234,所以toggle_value = 0x1234。
- 两者相等,输出
correct value,说明数据未出错。
如果RAM数据发生错误,比如myvalue_32bit变成0xEDCB1235:
initial_value = 0x1235,toggle_value = ~0xEDCB = 0x1234,两者不相等,输出false value,成功检测到数据错误。
内容的提问来源于stack exchange,提问作者user2986042
相关产品推荐
相关产品推荐

