C++ 写入矩阵中的特定位
c++ write on specific bits in matrix
我今天遇到了一个非常简单的问题。我有一个矩阵float gradient[COLS][ROWS]
.您可能知道float
类型包括 32 位。 在我的代码中,我对另一个表进行了 4 种不同的检查。对于他们中的每一个,我想写gradient[][]
结果。
我想做的是将这些结果写在 8 位上gradient[][]
. 因此,LSB 将包含第一个检查的结果,随后的 8 位包含第二个检查的结果,依此类推。
至于我想这样做的原因,是因为我试图使用 HLS 合成这段代码,并让它在 Xilinx ZedBoard 上运行。然而,FPGA上可用的内存不多,因此与其将我的4个函数的结果存储到4个不同的矩阵中,不如使用位运算将它们存储在同一个矩阵中。
我知道我可以像gradient[][]&0xFF
这样的 AND 运算符一起使用掩码。然而,我不确定的是我何时以及如何使用这个面膜?
作为一个例子,这里是其中一个检查的代码(西班牙名字我没有写这个(:
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
一样轻松访问单个字节
相关文章:
- 重新定位图像时如何前进到下一个内存块
- 流填充字符的默认定位
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- NS3 - python.h 文件无法定位编译错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- GLEW 未在 MSYS2 上定位 OpenGL 函数
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 如何忽略32位整数中的特定位
- 如何在C++中使用光标定位
- 使用 stdio.h 重新定位和重命名文件C++
- R 包安装错误:重新定位 0 具有无效的符号索引 11
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- 不能使用使用 lib*.a 的 CDT ---对符号 .. 的重新定位R_X86_64_32S
- 如何在VS2015中重新定位VS2017解决方案?
- 使用 for_each 和 lambda 销毁已定位的对象
- 在"for loop"中使用GOTOXY定位
- 是否可以为虚幻引擎/Unity制作64位定位系统?
- 干净地破坏动态定位对象的向量
- 重新定位源文件时读取调试符号