Cで固定小数点符号付きQ8形式から固定小数点符号付きQ4形式に変換する必要があります。4 だけビットシフトできると思いますが、これは正しいですか? 符号ビットを考慮する必要がありますか?
更新: これは ARM11 アーキテクチャ用ですが、アーキテクチャ固有ではないソリューションをお勧めします。
ありがとう
Cで固定小数点符号付きQ8形式から固定小数点符号付きQ4形式に変換する必要があります。4 だけビットシフトできると思いますが、これは正しいですか? 符号ビットを考慮する必要がありますか?
更新: これは ARM11 アーキテクチャ用ですが、アーキテクチャ固有ではないソリューションをお勧めします。
ありがとう
ビットシフトは機能するはずであり、多くのアーキテクチャで符号ビットも処理します。負の数の場合、より多くの 1 がシフトインされますが、下位 5 ビットのみを使用するか、正しい 2 の補数を形成するためにこれらの追加ビットが必要な場合に C で算術演算を実行します。
int を仮定すると、コードは単純に次のようになります。
int q4 = q8 >> 4;
おそらくあなたは丸めたいと思うでしょう:
int ahalf = q8 >= 0 ? (1<<3) : (1<<3)-1;
int q4 = (q8+ahalf) >> 4;
わかりました、Oli に耳を傾け、正符号をシフトしないアーキテクチャのソリューションを提示します。
int q4 = q8 / (1<<4);
オプティマイザは、可能であれば除算をシフトに変換する必要があります。
丸めを使用すると、最初の解決策は次のとおりです。
int ahalf = q8 >= 0 ? (1<<3) : -(1<<3);
int q4 = (q8+ahalf) / (1<<4);
R.. の粘り強さのおかげで、最終的にすべてのバージョンをテストしたところ、Linux で Intel 32 ビット符号付き整数を使用して正しい結果が得られるようになりました。
私は、C の右シフト動作が実装定義であることを知っています。規格の 6.5.7/5 を参照
(下の画像のように MSB をコピーするコンピュータもあれば、「0」を追加するコンピュータもあります)
![]()
符号ビットを気にするのは大したことではないようです。
ただし、コードが同じマシンでのみコンパイルされる場合は、そのマシンの実装を確認し、「機能する」場合は符号ビットを無視できます。