2016-06-20 12 views
-2

Вопрос о коде на рисунке 14-6 в here.Что делает переменная маски в этой контрольной сумме CRC?

Маска рассчитывается как:

mask = -(crc & 1) 

Почему мы & с 1 CRC, а затем сделать отрицательный результат? На рисунке 14-5 нет этой переменной маски, почему?

Edit:

Таким образом, с этой точки понятно, почему у нас есть эта линия также:

crc = crc^byte; 

Эта линия не присутствует на рисунке 14-5.

Может ли эта программа использоваться, если длина полиномиального генератора не кратная 8 бит?

ответ

1

Что это значит - проверить наименее значимый бит 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), будет потерян.

+0

Ну, это довольно загадочный способ установить его на все 1 или более 0. Рад, что я задал этот вопрос здесь. – quantum231

+0

Спасибо, а как насчет crc = crc^byte? – quantum231

+0

Это XOR-ing. – skyking

0

Эта операция превращает наименее значимый бит в маску.

Например, для 8-битового значения (для простоты) мы имеем:

00000000 -> 00000000 
00000001 -> 11111111 

Используя унарный минус усложняет схему функции CRC массивно, которые в противном случае не требует никаких операций сложения. Он может быть реализован в виде функции Кроме того, как следует

-x = ~x + 1 

Некоторые архитектуры может поддерживать бит-вектор «широковещательный» операцию, чтобы отправить младшие биты для всех остальных битов, что даст огромный прирост производительности.

+0

Кстати, может ли эта программа использоваться, если длина полиномиального генератора не кратная 8 бит? – quantum231

+0

Да, техника маскировки все еще работает для любой длины бит. –