Ich habe heute ein ziemlich einfaches Problem. Ich habe eine Matrix float gradient[COLS][ROWS]
. Wie Sie wahrscheinlich wissen, enthält der float
Typ 32 Bits. In meinem Code mache ich 4 verschiedene Prüfungen an einer anderen Tabelle. Für jede von ihnen möchte ich in gradient[][]
die Ergebnisse schreiben.C++ schreibe auf spezifische Bits in Matrix
Was ich tun möchte, ist diese Ergebnisse auf 8 Bits in gradient[][]
schreiben. Also das LSB würde das Ergebnis der ersten Prüfung enthalten, die 8 folgenden Bits die Ergebnisse der zweiten Prüfung und so weiter.
Der Grund, warum ich das tun möchte, ist, weil ich versuche, diesen Code mit HLS zu synthetisieren und es auf einem Xilinx ZedBoard laufen zu lassen. Es ist jedoch nicht viel Speicher auf dem FPGA verfügbar, und statt die Ergebnisse meiner 4 Funktionen in 4 verschiedenen Matrizen zu speichern, möchte ich sie in der gleichen Matrix unter Verwendung von Bitoperationen speichern.
Ich weiß, ich kann Masken mit einem AND-Operator wie gradient[][]&0xFF
verwenden. Was ich allerdings nicht weiß ist wann und wie ich diese Maske anwende?
Als Beispiel hier ist der Code für eine der Prüfungen (sry für den spanischen Namen ich dies nicht schreiben):
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;
}
}
}
Sie für Ihre Antworten im Voraus Dank!
'Wie Sie wahrscheinlich wissen, enthält der Float-Typ 32 Bits." Nein, das wissen wir nicht. Die Größe und das Layout werden nicht von der Sprache festgelegt. Sich auf Annahmen über die Repräsentation zu verlassen, ist eine todsichere Möglichkeit, schlecht geformten Zeitbombencode zu schreiben. –
Ich verstehe immer noch nicht * warum * Sie möchten Bitoperationen auf 'float' durchführen? Was genau soll das Ergebnis dieser Operation sein (und warum muss es im Float gespeichert werden)? – UnholySheep
@underscore_d Nun, ich bin kein Experte, aber: 'Single-Precision Fließkomma-Format ist ein Computer-Nummer-Format, das 4 Bytes (32 Bits) in Computer-Speicher belegt und einen breiten dynamischen Bereich von Werten durch Verwendung eines Gleitkomma darstellt. ' –