You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用按位与和按位非运算检测冗余值?代码逻辑解析求助

代码逻辑拆解与位运算说明

这段代码是通过冗余校验检测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));

这行分两步执行:

  1. myvalue_32bit >>16:把32位数据整体右移16位,原来的高16位会移动到低16位的位置,新的高16位补0,这样就提取出了冗余备份的16位数据。
  2. ~按位非运算:将提取出的备份数据每一位取反(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:42:41