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

C++ CRC实现代码中mod2div函数std::string(pick, '0')作用咨询

CRC算法mod2div函数逻辑详解

前置说明

本次示例使用的测试数据:

  • 待编码数据 data = 1010101010
  • CRC密钥 key = 11001(长度为5)
    CRC运算的核心是模2除法,规则是无进位借位,按位做异或运算,最终得到的余数就是CRC校验值。mod2div函数的作用就是实现这个模2除法,返回余数。

std::string(pick, '0') 作用说明

这是C++标准库std::string的填充构造函数:

  • 第一个参数是生成字符串的长度,第二个参数是用于填充的字符
  • 此处作用是生成一个长度为pick、所有字符都为'0'的字符串
  • 业务逻辑层面:模2除法中只有当前运算的临时值最高位为1时,才需要和除数做异或;如果最高位为0,这一步等价于和全0串做异或,结果和原临时值去掉最高位的部分完全一致,用这种写法可以统一两种分支的代码逻辑,避免冗余。

mod2div 函数逐逻辑讲解

我们先明确示例中函数的入参:

  • 被除数divident是原数据补key长度-1个0后的结果,即10101010100000,总长度14
  • 除数divisor就是密钥11001,长度5

函数执行步骤:

  1. 初始化:pick 赋值为除数长度5,取被除数前5位赋值给临时变量tmp,即tmp = 10101,被除数总长度n=14
  2. 进入循环(循环条件:pick < 14,对应还没带完被除数的所有位):
    • 若tmp第一位为1:用tmp和除数做异或,异或结果拼接当前pick指向的被除数下一位字符,赋值给新的tmp
    • 若tmp第一位为0:用tmp和长度为pick的全0串做异或,异或结果拼接当前pick指向的被除数下一位字符,赋值给新的tmp
    • pick自增1,继续下一轮循环
  3. 循环结束后,已经带完了被除数的所有位,再做最后一次异或处理,得到最终的余数
  4. 返回余数,也就是CRC校验值

补充说明xor1函数的配合逻辑:

xor1函数遍历是从下标1开始的,所以每次异或运算都会自动丢弃最高位,返回结果长度为pick-1,拼接一位新的被除数字符后刚好回到pick长度,完美对应手工计算模2除法时「左移一位带下一位」的操作。


内容的提问来源于stack exchange,提问作者Aditya kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:54:05