掩码变量在CRC校验和计算中做了什么?

时间:2016-06-20 12:02:53

标签: c crc bitmask crc32 crc16

问题是关于here中图14-6中的代码。

掩码计算如下:

mask = -(crc & 1)

为什么我们& crc用1然后使结果为负数?图14-5没有这个掩码变量,为什么?

编辑:

所以既然这一点很清楚,为什么我们也有这条线:

crc = crc ^ byte;

图14-5中没有该行。

如果生成多项式长度不是8位的倍数,可以使用该程序吗?

2 个答案:

答案 0 :(得分:1)

这样做是为了检查ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + RemoteCalculator.class.getName()的最低有效位然后否定它。结果是,如果该位为零,则crc将为零(即全为零),如果该位为1,则mask将为mask(即全部为1)。这用于有条件xor与-1

另一种解决方案是使用0xEDB88320来制定该条件。

他们在第二种解决方案中使用的第二个技巧是在一次操作中对所有8位进行位检查。在第一个示例中,他们使用if(这意味着检查最高有效位或符号位的XOR),然后将(int)(crc^byte) < 0crc向左移一位并在下一位做同样的事情。在第二个例子中,它们一次执行XOR 8位,然后检查结果的每个位。

要了解会发生什么,请考虑我们是否将第一个示例更改为:

byte

其中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修改的位将丢失。

答案 1 :(得分:0)

此操作将最低有效位转换为掩码。

例如,对于8位值(为简单起见),我们有:

00000000 -> 00000000
00000001 -> 11111111

使用一元减号使CRC功能的电路大量复杂化,否则不需要加法运算。它可以作为加法函数实现,如下所示

-x = ~x + 1

某些架构可能支持位向量“广播”操作,将最低有效位发送到所有其他位,这将带来巨大的性能提升。