今日はかなり単純な問題がありました。行列はfloat gradient[COLS][ROWS]
です。おそらく、float
タイプには32ビットが含まれています。 私のコードでは、別のテーブルで4種類のチェックを行います。それぞれについて、結果をgradient[][]
に書きたいと思います。C++マトリックス内の特定のビットに書き込む
私がしたいことは、gradient[][]
に8ビットでこれらの結果を書き込むことです。 LSBには、最初のチェックの結果、次の8ビット、2回目のチェックの結果などが含まれます。
私がこれをやりたい理由は、HLSを使ってこのコードを合成し、ザイリンクスZedBoard上で実行しようとしているからです。しかし、FPGA上で利用可能なメモリはそれほど多くありませんので、私の4つの関数の結果を4つの異なる行列に格納するのではなく、ビット演算を使って同じ行列に格納するのが良いでしょう。
私は、gradient[][]&0xFF
のようなAND演算子でマスクを使用できます。しかし、私はこのマスクを適用する時期と方法はわかりません。ここでは例として
は、小切手の1(SRYスペイン語の名前のために私はこれを書いていない)のためのコードです:
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;
}
}
}
は、あなたの答えを事前にありがとうございます!
「浮動小数点型には32ビットが含まれていることはご存知のように、わかりません。サイズとレイアウトは言語によって指定されていません。表現についての前提に依拠することは、不正な形式の時限コードを書くための確実な方法です。 –
私はまだ理解していない*なぜ*あなたは 'float'でビット操作を実行したいですか?この操作の結果は正確に何であるべきですか(そしてなぜそれが 'float'の中に格納される必要がありますか)? – UnholySheep
@underscore_d私はエキスパートではありませんが、「単精度浮動小数点フォーマットは、コンピュータメモリで4バイト(32ビット)を占め、浮動小数点を使用して幅広いダイナミックレンジを表現するコンピュータナンバーフォーマットです。 ' –