Was das ist, ist das niedrigstwertige Bit von crc
zu überprüfen und dann zu negieren. Der Effekt ist, dass, wenn das Bit Null ist, mask
Null ist (das sind alles Nullen) und wenn das Bit eins ist, wird mask
-1
sein (das sind alle Einsen). Dies wird verwendet, um xor mit 0xEDB88320
bedingt. Die andere Lösung verwendet stattdessen if
, um diese Bedingung zu erfüllen.
Der zweite Trick, den sie in der zweiten Lösung verwenden, besteht darin, den XOR für die Bitprüfung in einem Vorgang für alle acht Bits auszuführen. Im ersten Beispiel verwenden sie (int)(crc^byte) < 0
(was eine Prüfung auf das XOR des höchstwertigen Bits oder des Vorzeichenbits bedeutet), sie verschieben dann sowohl crc
als auch byte
ein Bit nach links und machen dasselbe auf dem nächsten Bit. Im zweiten Beispiel führen sie das XOR acht Bits gleichzeitig aus und prüfen dann jedes Bit des Ergebnisses.
Um zu sehen, was passiert, betrachten, wenn wir das erste Beispiel zu ändern:
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;
}
wo mask_sign_bit
Masken, außer dem Vorzeichenbit jedes Bit, wird das Zeichen crc^byte
die gleiche wie crc^mask_sign_bit(byte)
so die Folge der if
Anweisung wird gleich. Wenn dann crc
nach links verschoben wird, geht das durch crc = crc^mask_sign_bit(byte)
geänderte Bit verloren.
Nun, das ist eine ziemlich kryptische Art, es auf alle 1s oder alle 0s zu setzen. Froh, dass ich diese Frage hier gestellt habe. – quantum231
Danke, was ist mit crc = crc^byte? – quantum231
Das ist das XOR-ing. – skyking