c ++写入矩阵中的特定位

时间:2017-06-30 14:02:00

标签: c++ fpga bitmask

今天我遇到了一个非常简单的问题。我有一个矩阵float gradient[COLS][ROWS]。您可能知道float类型包含32位。 在我的代码中,我对另一个表进行了4次不同的检查。对于他们每个人,我想写gradient[][]结果。

我想要做的是将这些结果写在gradient[][]中的8位上。 因此,LSB将包含第一个Check的结果,后面的8个位包含第二个Check的结果,依此类推。

至于我想要这样做的原因,那是因为我正在尝试使用HLS合成此代码并使其在Xilinx ZedBoard上运行。然而,FPGA上没有太多可用内存,所以不是将我的4个函数的结果存储到4个不同的矩阵中,而是希望使用位操作将它们存储在同一个矩阵中。

我知道我可以使用带有gradient[][]&0xFF等AND运算符的掩码。然而,我不确定何时以及如何应用此面具?

这里的例子是其中一个支票的代码(西班牙名字的sry我没写这个):

void FullCheck(float brightness_tab[COLS][ROWS]){
    for(int i=0;i<ROWS;i++){
        int previous_point = (int)(brightness_tab[0][i]);
        for(int j=1;j<COLS-1;j++){
            float brightness=brightness_tab[i][j];
            int brightnessi=(int)(brightness);
            gradient[i][j]=brightnessi- previous_point;
            if(!(gradient[i][j]>VALOR_PENDIENTE || gradient[i][j]<-VALOR_PENDIENTE)){
                if(!(gradient[i][j] + gradient[i][j-1] >VALOR_PENDIENTE_TRUNCAR || gradient[i][j] + gradient[i][j+1]<-VALOR_PENDIENTE_TRUNCAR)){
                    gradient[i][j]=0;
                }
            }
            if(j<2 || i<2 || COLS-1 ==i){gradient[i][j]=0;}
            previous_point=brightnessi;
        }
    }
}

提前感谢您的回答!

2 个答案:

答案 0 :(得分:1)

从您的评论中推断,我假设gradient将被声明为int数组。

在您的示例代码中,有两种情况可以将内容写入矩阵。在第一种情况下,您想要写一些值,例如这一行:

gradient[i][j] = brightnessi - previous_point;

如果要将某些数据写入特定字节,则要写入的数据本身应为1字节数据。

gradient[i][j] = 0;          // initialize to all zero bits
int data1 = 0x12;            // 1-byte value
gradient[i][j] |= data1;     // writing to the 1st byte (LSB)
int data2 = 0x34;
gradient[i][j] |= data2 << 8;   // writing to the 2nd byte
int data3 = 0x56;
gradient[i][j] |= data3 << 16;  // writing to the 3rd byte
int data4 = 0x78;
gradient[i][j] |= data4 << 24;  // writing to the 4th byte

执行上述代码后,gradient[i][j]的值将为0x78563412

第二种情况是通过写0来清除之前写的内容,例如这一行:

gradient[i][j] = 0;

在这种情况下,您可以

gradient[i][j] &= 0xffffff00;    // clearing the 1st byte (LSB)
gradient[i][j] &= 0xffff00ff;    // clearing the 2nd byte
gradient[i][j] &= 0xff00ffff;    // clearing the 3rd byte
gradient[i][j] &= 0x00ffffff;    // clearing the 4th byte

答案 1 :(得分:1)

您还可以执行具有相同内存布局的结构

struct Bytes
{
  uint8_t a;
  uint8_t b;
  uint8_t c;
  uint8_t d;
 } ;

Bytes* g = reinterpret_cast<Bytes*>(&gradient[i][j]);

通过这种方式,您可以像g->a

一样轻松访问各个字节