C中的快速乘法代码

时间:2012-08-27 16:43:32

标签: c

我正在研究乘法源代码,我不理解这个函数乘以x*A。请帮我用任何数字示例理解这一点吗?

#define BITS_PER_LONG (8 * sizeof (unsigned long))

typedef struct matrix{
int rown;//number of rows.
int coln;//number of columns.
int rwdcnt;//number of words in a row
int alloc_size;//number of allocated bytes
unsigned long *elem;//row index.
}*binmat_t;

void mat_vec_mul(unsigned long *cR, unsigned char *x, binmat_t A)
{
    int i,j;
    unsigned long *pt;

    memset(cR, 0, A->rwdcnt*sizeof(long));
    pt = A->elem;
    for(i=0; i<A->rown; i++)
    {
        if ((x[i/8] >> (i%8)) & 1)
            for (j = 0;  j < A->rwdcnt;  ++j)
                cR[j] ^= *pt++;
        else
            pt += A->rwdcnt;
    }
}

1 个答案:

答案 0 :(得分:2)

x是位向量,它存储在char数组中。 x中的比特数是A-> rown。表达式(x[i/8] >> (i%8)) & 1选择x的 th 位。

A是无符号长整数的二维数组,具有A-> rown行和A-> rwdcnt列。

cR是具有A-> rwdcnt元素的无符号长的向量。进入此程序后,cR将被清除。

if语句确定x中的i th 位是否打开。如果该位打开,则A的i th 列被“添加”到cR。如果该位关闭,则else子句跳过此A列。由于某个位只能包含值1或0,因此if-else相当于将A的列乘以该位,将产品添加到cR。

“添加”由XOR完成。这里的解释不清楚。可能每个cR是单个比特阵列(和A的每一列),或者可能是cR(和A中)中的每个无符号长表示模2的整数上的多项式。 (这是密码学中的常见类型。)

我怀疑cR是一个比特数组,而A-> rwdcnt = A-> coln / BITS_PER_LONG。

实际上,这是对模2的整数的标准数组乘法。