问题是关于here中图14-6中的代码。
掩码计算如下:
mask = -(crc & 1)
为什么我们& crc用1然后使结果为负数?图14-5没有这个掩码变量,为什么?
编辑:
所以既然这一点很清楚,为什么我们也有这条线:
crc = crc ^ byte;
图14-5中没有该行。
如果生成多项式长度不是8位的倍数,可以使用该程序吗?
答案 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) < 0
和crc
向左移一位并在下一位做同样的事情。在第二个例子中,它们一次执行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
某些架构可能支持位向量“广播”操作,将最低有效位发送到所有其他位,这将带来巨大的性能提升。