2

假设我有:(数据)mod(多项式)

1110 0101 型号 1001

我知道我需要将多项式移到数据的最左边并执行 XOR 操作。

1110 0101
1001

我会得到一个结果

0111 0101

然后我需要设置多项式以在结果中找到下一个“1”并将多项式移动到该位置并执行下一个异或运算,并重复这些步骤直到我得到余数。

所以,我知道我需要将我的数据复制到一个数组并使用该数组我可以进行移位并使用 AND 运算符并将数据的第一位与多项式的第一位进行比较,如果我得到结果'1' 然后我就会知道我可以将多项式移动到那个位置。

这是我的代码片段:

   uint8_t polyarray[4];
   uint32_t dataarray[32];

   uint64_t mod(int data, int poly, int i) {

        memcpy(polyarray, (int[]) {1}, sizeof polyarray);
        memcpy(dataarray, (int[]) {1,2,3,4}, sizeof dataarray);

        for (i=127; i>=0; i--){
            poly << i;
            dataarray[4]>>31;
            polyarray[1]>>3;
            if(dataarray[4] & polyarray[1]=1){
                data = data ^ poly;
            }
        }

我很确定我的代码不完整,但我不确定在哪里,有人可以帮助我吗?

我再次重做我的代码,这会更好吗?

    void mod(uint8_t i, uint64_t *pPoly, uint64_t *pData)
{
        uint64_t Data[128];
        uint64_t Poly[4];

    for(i=127; i>=0; i--)
    {
            Poly << i;
            pData = &Data[i];
            pPoly = &Poly[3];
                if (pData = 1)
                {
                    Data = Data^Poly;
                }
                else
                {
                    Poly>>1;
                    i--;
                }
    }
}
4

1 回答 1

0
  1. 你说的是 128 位,但你有 128*64 位。
  2. 聚 << 我; 移动 poly 没有效果;您必须存储结果。
  3. 数据=数据^聚;异或两个指向数组的指针,而不是位数组中的位
  4. pData = &Data[i]; pPoly = &Poly[3]; 未使用
  5. if( pData = 1 ) 缺少“=”

这是我的代码

int main()
{
    uint64_t hi = 0;
    uint64_t lo = 0b11100101;
    uint64_t div = 0b1001;

    uint64_t mask = 1L << 63;
    uint8_t offset = 0;

    /* search te MSB */
    for (int i = 0; i < 64; i++)
    {
        if ( (mask >> i) & div )
        {
            offset = i;
            break;
        }

        /* 
        before:
            div = 00001001
            mask= 10000000

        after:
                  |---|
            mask= 00001000
            off = 4    
        */
    }

    /* 00001001 */
    div <<= offset;
    /* 10010000 */

    for(int i = 0; i < 64; i++)
    {
        /* XOR if MSB of HI is 1 */
        if ( hi & (mask >> i) )
        {
            hi ^= (div >> i);

        /* if we have to xor in HI and LO together, cause by overlap */
        /* HI           LO                                           */
        /* 000000000000 000000001001                                 */
        /*   DIV 000100 00000                                        */
            if ( i > 0 )
            { 
                lo ^= (div << (64 - i));
            }           
        }
    }

    for(int i = 0; i <= offset; i++)
    {
        if ( lo & (mask >> i) )
        {
            lo ^= (div >> i);
        }
    }

    printf("mod = %" PRIX64 "%" PRIX64 "\n", hi, lo); 
}

关键是,您必须正确移动掩码和除数,并将其与除数进行异或。模数存储在 lo 中的最后一个偏移字节中。

可能存在一些 128 位指令,可以一步完成所有工作。

于 2014-02-02T12:59:46.413 回答