c语言 - 错误:二进制 ^ 的操作数无效(有"双精度"和"双精度") - 我不是在尝试使用 ^ 作为幂运算符



我一直在寻找答案,但找不到。我不是在尝试使用 ^ 作为电源运算符。

这是我的问题。 我正在尝试从数字电视标准(物理层协议)中重现交织器。这是一个学校项目。 这是我到目前为止在 C 中的代码:

#include <sys/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <unistd.h>
#include <stdbool.h>
#include <string.h>
#include <complex.h>
#include <math.h>
int main()
{
int Mmax = 32768; 
int Nr = log10(Mmax)/log10(2);
printf("Nr = %i n",Nr);
int Lfm = 42; 
int i,j,k,l; 
// Create array R'i 
unsigned char Rli[Mmax][Nr];
for (i = 0; i < Mmax; i++)
memset(Rli[i], 0, sizeof(unsigned char)*(Nr));
for (i = 0; i < Mmax; i++)
{
for(j = 1; j < Nr; j++)
{
if(i == 0 || i == 1)
{
Rli[i][j] = 0;
}
else if(i == 2)
{ 
Rli[i][j] = 0;
if(j == Nr - 2)
Rli[i][j] = 1;
}
else
{
Rli[i][j+1] = Rli[i-1][j]; 
}
}
if(i > 2)
{
Rli[i][1] = (((Rli[i-1][14] ^ Rli[i-1][13] ) ^ Rli[i-1][12] ) ^ Rli[i-1][2]);
}
Rli[i][0] = 0;
}
// wire permutation for array R'i - creates array Ri
unsigned char Ri[Mmax][Nr];
for (i = 0; i < Mmax; i++)
memset(Ri[i], 0, sizeof(unsigned char)*(Nr));   
for (i = 0; i < Mmax; i++)
{
Ri[i][1] = Rli[i][8]; //Rli[i][7];
Ri[i][2] = Rli[i][9]; //Rli[i][8];
Ri[i][3] = Rli[i][14]; //Rli[i][13];
Ri[i][4] = Rli[i][4]; //Rli[i][3];
Ri[i][5] = Rli[i][6]; //Rli[i][5];
Ri[i][6] = Rli[i][13]; //Rli[i][12];
Ri[i][7] = Rli[i][3]; //Rli[i][2];
Ri[i][8] = Rli[i][2]; //Rli[i][1];
Ri[i][9] = Rli[i][12]; //Rli[i][11];
Ri[i][10] = Rli[i][5]; //Rli[i][4];
Ri[i][11] = Rli[i][10]; //Rli[i][9];
Ri[i][12] = Rli[i][11]; //Rli[i][10];
Ri[i][13] = Rli[i][1]; //Rli[i][0];
Ri[i][14] = Rli[i][7]; //Rli[i][6];
}
// Offset generator Gk
int Gmax = floor(Lfm/2);
unsigned char Gk[Gmax][Nr];
for (i = 0; i < Gmax; i++)
memset(Gk[i], 0, sizeof(unsigned char)*Nr-1);
for (k = 0; k < Gmax; k++)
{
for(j = 0; j < Nr; j++)
{
if(k == 0)
{ 
Gk[k][j] = 1; 
}
else
{ 
Gk[k][j+1] = Gk[k-1][j];
}
} 
if(k > 0)
{ 
Gk[k][0] = ( Gk[k-1][14] ^ Gk[k-1][13] );
}
}
// interleaving sequence
int Ndata = 26303; // numero de data 
unsigned char Hl[Ndata];
double H1[Ndata], H2[Ndata];
memset(Hl, 0, sizeof(unsigned char)*Ndata);
memset(H1, 0, sizeof(double)*Ndata);
memset(H2, 0, sizeof(double)*Ndata);
int p,indice;
// loop from page 107 of the physical layer protocol.
for (i = 0; i < Lfm; i++) 
{
for (k = 0; k < Mmax; k++) 
{
p = 0;
for (j = 0; j < Nr; j++) // sum
{
if(j >= 0 && j <= Nr - 2)
H1[p] += Ri[k][j]*pow(2,j);
else if(j >= 0 && j <= Nr - 1)
{
indice = floor(i/2);
H2[p] += Gk[indice][j]*pow(2,j);
}
}
/*****/ Hl[p] = ((i % 2)*pow(2,Nr-1) + H1[p] ) ^ H2[p]; /*****/
if (Hl[p] < Ndata)
p += 1;
}
}

最后,当我尝试编译时,/*****/之间的行会生成错误。

freqint.c:146:43: error: invalid operands to binary ^ (have ‘double’ and ‘double’)
Hl[p] = ((i % 2)*pow(2,Nr-1) + H1[p] ) ^ H2[p];

我想在那里进行异或操作,但我无法正确完成。

我从这里拿这个。

交错序列在第 107 页的底部

如何编写代码以避免该错误消息并仍然执行 XOR?

如注释中所述,^运算符不能在double上使用,但是您不需要使用double

您正在使用两个返回double的函数,即powfloor

每次你打电话给pow,你都会传递2为基地。 通过将指数的值左移1,可以更有效地将 2 提高到一个幂。

同样,每次调用floor时,都会将整数值除以2。 由于整数除法会自动删除除法的余数(假设您只使用正值),因此调用floor不会给您带来任何好处。

因此,将所有pow(2,x)实例更改为(1 << x),并将floor(x/2)的所有实例更改为(x/2)。 然后,您可以将H1H2声明为unsigned int数组,您将能够使用 XOR 运算符^

最新更新