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; irown; i++) { if ((x[i/8] >> (i%8)) & 1) for (j = 0; j rwdcnt; ++j) cR[j] ^= *pt++; else pt += A->rwdcnt; } } 

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

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

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

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

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

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

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