我正在研究乘法源代码,我不理解这个函数乘以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;
}
}
答案 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的整数的标准数组乘法。