CRC 实现(位移顺序)

CRC implementation (order of bit shifting)

我不明白为什么CRC的理论和实现不一致?我的意思是在实现中我发现首先执行位移,然后执行异或。但是第一位不会被异或。并在解释中从第一位开始异或。 这是我的 CRC4

代码
public enum CRC4_POLY
{
    CRC4 = 0x0B //1011
};

public class CRC4Calc
{
    private byte[] table = new byte[16];

    public byte Checksum(params byte[] val)
    {
        if (val == null)
            throw new ArgumentNullException("val");

        byte c = 0;

        foreach (byte b in val)
        {
            c = table[c ^ b];
        }

        return c;
    }

    public byte[] Table
    {
        get
        {
            return this.table;
        }
        set
        {
            this.table = value;
        }
    }

    public byte[] GenerateTable(CRC4_POLY polynomial)
    {
        byte[] csTable = new byte[16];

        for (int i = 0; i < 16; ++i)
        {
            int curr = i;

            for (int j = 0; j < 4; ++j)
            {
                if ((curr & 0x8) != 0)
                {
                    curr = ((curr << 1) & 0x0F) ^ (int)polynomial; // why not?: curr = ((curr ^ (int)polynomial) <<1) & 0x0F;
                }
                else
                {
                    curr <<= 1;
                }
            }

            csTable[i] = (byte)curr;
        }

        return csTable;
    }

    public CRC4Calc(CRC4_POLY polynomial)
    {
        this.table = this.GenerateTable(polynomial);
    }
}

移出前寄存器的最高位,即被移出的位,确定多项式是否与移出后剩余的内容异或。这正是经典的移位寄存器实现。