Что это значит - проверить наименее значимый бит crc
, а затем отрицать его. Эффект заключается в том, что если бит равен нулю, то mask
будет равен нулю (это все нули), и если бит один, то mask
будет -1
(это все единицы). Это используется для условного обозначения xor с 0xEDB88320
.
Другое решение вместо этого использует if
, чтобы сделать это условие.
Второй прием, который они используют во втором решении, - это выполнить xor для проверки бит в одной операции для всех восьми бит. В первом примере они используют (int)(crc^byte) < 0
(что означает проверку для XOR самого значащего бита или знакового бита), затем они сдвигают оба 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)
, будет потерян.
Ну, это довольно загадочный способ установить его на все 1 или более 0. Рад, что я задал этот вопрос здесь. – quantum231
Спасибо, а как насчет crc = crc^byte? – quantum231
Это XOR-ing. – skyking