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

CRC初始移位寄存器全1设置与消息前n位取反等价性验证问题

错误原因

你对等价表述的理解存在偏差,全1初始移位寄存器的CRC计算,并不是等价于直接对原始消息的前n位取反,其等价操作的数学推导如下:
设消息多项式为M(x),长度为L比特,生成多项式为G(x),阶数为n,全1初始值对应的多项式为S(x) = x^{n-1} + x^{n-2} + ... + 1 = 2^n - 1。
全1初始CRC的计算过程等价于求解:(S(x) * x^L + M(x) * x^n) mod G(x)
而你代码中直接对消息前n位取反的操作,对应的是求解:((M(x) + (2^n - 1)*x^{L-n}) * x^n) mod G(x),二者显然不相等,这就是你得到结果不一致的核心原因。

正确的等效验证代码

你可以用如下修改后的MATLAB代码验证等价性:

x = [0 1 0 1 0 1 1 1];
div = [1 0 0 0 0 0 1 1 1];
n = length(div)-1;
L = length(x);

% 方法1:移位寄存器初始全1
x0 = [x zeros(1,n)];
rem0 = ones(1,n);
for k = 1:length(x0)
    rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1));
end
disp('方法1结果:')
disp(rem0)

% 方法2:等效操作,初始寄存器为0,叠加全1初始值的影响
x0 = [x zeros(1,n)];
rem0 = zeros(1,n);
% 前n次移位叠加初始全1的作用
for k = 1:n
    rem0 = bitxor([rem0(2:n) x0(k)], bitxor(rem0(1),1)*div(2:n+1));
end
% 后续移位正常计算
for k = n+1:length(x0)
    rem0 = bitxor([rem0(2:n) x0(k)], rem0(1)*div(2:n+1));
end
disp('方法2结果:')
disp(rem0)

运行后两种方法得到的结果完全一致,可以证明原表述是成立的,只是你的等效实现方式存在错误。

内容的提问来源于stack exchange,提问作者Jose Marcelo Lima Duarte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:24:03