私はなぜこのコードが動作するのか、-1.0と+1.0の間の倍精度を14ビットの整数に変換するために、なぜ&の理由を説明してもらえますか?なぜ& "14ビットInt"コードに "double"が作用するのですか?
data14でどのように値が選択されましたか、そして何が起こっていますか?あなたが操作の正しい順序を解析することができる場合
double data = 0.5;
if (data < -1.0) {
data = -1.0;
} else if (data > 1.0) {
data = 1.0;
}
int data14 = (int)((data+1.0)/2.0*16383 + 0.5);
BYTE upper7 = data14 >> 7;
BYTE lower7 = data14 & 0x7f;
ビットシフトとビットマスキングについて理解していますか?そうでない場合は、最初にそれらを学び、次にこれに戻ってください。今、いいですか? 10進の16383が16進数の0x3FFF、つまり11111111111111のバイナリ、つまり14の連続ビットであることを覚えておけば、このコードを理解するのに役立ちます。デバッガを使って、 'data14'の任意の与えられた値の生のバイトを見て、' data14'がなぜそれが設定されるのかを理解するための数学をします(例えば、 '0.5' - > '12287'、別名' 0x2FF')、なぜビットシフトが行われたのかを紙に書いています。 –
助けがあれば: '-1.0'は' 0'になり、 '1.0'は' 16383'( '0x3FFF'、つまり14ビット)になります。このコードは浮動小数点値を '-1.0..1.0'から' 0..16383'までの10進数値に変換しています。 –
データに1を加え、14ビット(0x3FFF)に2を掛けて0.5を加えた理由は何ですか? – Nop