簡體   English   中英

C ++寫矩陣中的特定位

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM