我编写了一个简单的程序来执行伽罗瓦有限域乘法,但不知何故该程序陷入了循环。
#include<stdio.h>
int GaloisMult(int a, int b){
int i,j=0,h=0,k,abits[8],bbits[8];
for (i = 0; i < 8; i++){
if(((a >> i) & 1) == 1) abits[j++] = i;
if(((b >> i) & 1) == 1) bbits[h++] = i;
}
for (i = 0; i < j; i++) printf("%d ",abits[i]);
printf("\n");
for (i = 0; i < h; i++) printf("%d ",bbits[i]);
int dbits[11] = {0};
//here
for (k = 0; k < h; k++) {
for (i = 0; i < j; i++){
int index = abits[i] + bbits[k];
dbits[index] = (dbits[index] + 1) % 2;
}
}
int val = 0;
for (i = 10; i >= 0; i--) val = (val << 1) | dbits[i];
while(val > 0xff) val ^= 0x11b;
return val;
}
int main(){
int a = 0xac;
int b = 0x0e;
printf("\n%02X * %02X = %02X",a,b,GaloisMult(a,b));
}
程序永远不会结束,不知何故陷入了二维 for 循环。
程序卡住的循环并不是在for循环中,而是在while循环中:
while(val > 0xff) val ^= 0x11b;
在这一行中,您正在执行异或运算。 XOR运算具有自反转属性,所以每次做
val ^ 0x11b = result
,就意味着在下一次迭代中,result ^ 0x11b = val
,所以会无穷无尽。
检查这一行,重新评估您的停止条件,并分析您想要在代码中执行的操作。
希望有帮助!