c ++写入矩阵中的特定位
c++ write on specific bits in matrix
我今天遇到了一个很简单的问题。我有一个矩阵 float gradient[COLS][ROWS]
。您可能知道 float
类型包含 32 位。
在我的代码中,我对另一个 table 进行了 4 次不同的检查。对于他们每个人,我都想在 gradient[][]
中写下结果。
我想做的是将这些结果写在 gradient[][]
中的 8 位上。
所以 LSB 将包含第一次 Check 的结果,后面的 8 位是第二次 Check 的结果,依此类推。
至于我想这样做的原因,是因为我正在尝试使用 HLS 合成此代码并在 Xilinx ZedBoard 上制作它 运行。然而,FPGA 上可用的内存不多,所以我不想将我的 4 个函数的结果存储到 4 个不同的矩阵中,而是想使用位运算将它们存储在同一个矩阵中。
我知道我可以使用带 AND 运算符的掩码,例如 gradient[][]&0xFF
。但是我不确定的是何时以及如何应用此面膜?
这里的一个例子是其中一个支票的代码(对不起,我没有写这个西班牙名字):
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;
}
}
}
提前感谢您的回答!
根据您的评论,我假设 gradient
将被声明为 int
数组。
在您的示例代码中,有 2 种情况向矩阵写入内容。在第一种情况下,您想写入一些值,例如这一行:
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
你也可以做一个具有相同内存布局的结构
struct Bytes
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} ;
Bytes* g = reinterpret_cast<Bytes*>(&gradient[i][j]);
这样您就可以像 g->a
一样轻松访问各个字节
我今天遇到了一个很简单的问题。我有一个矩阵 float gradient[COLS][ROWS]
。您可能知道 float
类型包含 32 位。
在我的代码中,我对另一个 table 进行了 4 次不同的检查。对于他们每个人,我都想在 gradient[][]
中写下结果。
我想做的是将这些结果写在 gradient[][]
中的 8 位上。
所以 LSB 将包含第一次 Check 的结果,后面的 8 位是第二次 Check 的结果,依此类推。
至于我想这样做的原因,是因为我正在尝试使用 HLS 合成此代码并在 Xilinx ZedBoard 上制作它 运行。然而,FPGA 上可用的内存不多,所以我不想将我的 4 个函数的结果存储到 4 个不同的矩阵中,而是想使用位运算将它们存储在同一个矩阵中。
我知道我可以使用带 AND 运算符的掩码,例如 gradient[][]&0xFF
。但是我不确定的是何时以及如何应用此面膜?
这里的一个例子是其中一个支票的代码(对不起,我没有写这个西班牙名字):
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;
}
}
}
提前感谢您的回答!
根据您的评论,我假设 gradient
将被声明为 int
数组。
在您的示例代码中,有 2 种情况向矩阵写入内容。在第一种情况下,您想写入一些值,例如这一行:
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
你也可以做一个具有相同内存布局的结构
struct Bytes
{
uint8_t a;
uint8_t b;
uint8_t c;
uint8_t d;
} ;
Bytes* g = reinterpret_cast<Bytes*>(&gradient[i][j]);
这样您就可以像 g->a