2

-32768 から 32767 までの 16 ビットのサンプルがあります。スペースを節約するために、8 ビットのサンプルに変換したいので、サンプルを 256 で割り、128 を足します。

-32768 / 256 = -128 + 128 = 0
32767 / 256 = 127.99 + 128 = 255.99

これで、0 は 1 バイトに完全に収まりますが、255.99 は 255 に丸める必要があり、精度が失われます。これは、元に戻すと 32767 ではなく 32512 が得られるためです。

元の最小値/最大値を失わずにこれを行うにはどうすればよいですか? 非常に明白な思考エラーを犯していることはわかっていますが、どこに間違いがあるのか​​ わかりません。

もちろん、除算によって精度が失われ、8 ビット サンプルから元の値を推測できないことは十分承知していますが、なぜ元の最大値が得られないのか不思議に思っています。

4

3 に答える 3

0

16 ビットの整数値を 8 ビットの整数値の範囲に圧縮しようとしている場合は、最上位の 8 ビットを取得して保持し、最下位の 8 ビットを破棄します。通常、これはビットをシフトすることによって達成されます。>>演算子は最上位ビットから最下位ビットへのシフトであり、8 回または>>8. 8BitInt = (16BitInt & 65280)/256; のようなものを使用して、バイトをマスクして、除算の前に丸めを行う 00 を除算することもできます。[65280 別名 0xFF00]

値からシフトするすべてのビットは、2 による除算のように半分になり、切り捨てられます。

上記のすべては、符号付き整数を扱っているという事実によって複雑になります。

最後に、実際にこれを試したことがないため、ここですべてを取得したと 100% 確信しているわけではありません。

于 2013-06-07T01:32:48.467 に答える
0

数値 256 を 8 ビットの符号なし整数として表すことができないため、元の最大値を取得できません。

于 2013-06-07T01:13:44.847 に答える