[英]c++ write on specific bits in matrix
今天我遇到了一個非常簡單的問題。 我有一個矩陣float gradient[COLS][ROWS]
。 如您所知, float
類型包括32位。 在我的代碼中,我對另一個表進行了4種不同的檢查。 對於它們中的每一個,我都希望將結果寫在gradient[][]
中。
我想做的就是將這些結果寫在gradient[][]
8位上。 因此,LSB將包含第一個Check的結果,隨后的8位包含第二個Check的結果,依此類推。
至於我要這樣做的原因,是因為我正在嘗試使用HLS合成此代碼,並使它在Xilinx ZedBoard上運行。 但是,FPGA上沒有多少可用內存,因此,我不想將4個函數的結果存儲到4個不同的矩陣中,而是希望使用位運算將它們存儲在同一矩陣中。
我知道我可以將AND和運算符與mask一起使用,例如gradient[][]&0xFF
。 但是我不確定何時以及如何使用此面膜?
作為示例,以下是其中一項Checks的代碼(對西班牙名字(我沒有寫過)很抱歉):
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
一樣輕松訪問各個字節
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.