问题是关于图 14-6 中的代码。
掩码的计算公式为:
mask = -(crc & 1)
为什么我们和crc用1,然后使结果为阴性?图 14-5 没有这个掩码变量,为什么?
编辑:
那么既然这一点很清楚,为什么我们还要有这条线:
crc = crc ^ byte;
图 14-5 中不存在此行。
如果生成器多项式长度不是 8 位的倍数,可以使用该程序吗?
这样做是检查crc
的最低有效位,然后否定它。效果是,如果位为零,则mask
将为零(即全部为零),如果位为 1,则mask
将为-1
(即全部为 1)。这用于有条件地与0xEDB88320
进行异或。
另一种解决方案则使用if
来制定该条件。
他们在第二个解决方案中使用的第二个技巧是在一次操作中对所有八个位执行位检查的异或。在第一个示例中,他们使用(int)(crc^byte) < 0
(这意味着检查最高有效位或符号位的异或),然后将crc
和byte
向左移动一位,并在下一个位上执行相同的操作。在第二个示例中,他们一次执行 XOR 八位,然后检查结果的每个位。
要查看会发生什么,请考虑我们是否将第一个示例更改为:
for(j=0; j<=7; j++) {
crc = crc ^ mask_sign_bit(byte);
if( (int)crc < 0 )
crc = (crc << 1) ^ 0x04C11DB7;
else
crc = crc << 1;
byte = byte << 1;
}
如果mask_sign_bit
屏蔽了除符号位之外的所有位,则crc ^ byte
的符号与crc ^ mask_sign_bit(byte)
相同,因此if
语句的结果变得相同。然后,当crc
向左移动一步时,crc = crc ^ mask_sign_bit(byte)
修改的位将丢失。
此操作将最低有效位转换为掩码。
例如,对于 8 位值(为简单起见),我们有:
00000000 -> 00000000
00000001 -> 11111111
使用一元减号会使CRC功能的电路大大复杂化,否则不需要加法操作。它可以实现为加法函数,如下所示
-x = ~x + 1
某些体系结构可能支持位向量"广播"操作,将最低有效位发送到所有其他位,这将带来巨大的性能提升。