2012-05-02 19 views
0

アライメントされた配列uint8[8]doubleに変換しようとすると、少し難題があります。 ビット操作でuint8[4]longに変換することは特に簡単でしたが、doubleが符号ビットに関して面倒になることがありますか?アライメントされた配列uint8 [8]をdoubleに変換する

私は単に ByteBuffer.wrap(bytes).getDouble()を使用しますが、私はこのコードを実装しようとしましたが、最後のコマンドがエラーに Expression is not assignableShift count >= width of type

long tempHigh = 0; 
long tempLow = 0; 
double sum = 0; 
tempHigh |= buffer[0] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[1] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[2] & 0xFF; 
tempHigh <<= 8; 
tempHigh |= buffer[3] & 0xFF; 

tempLow |= buffer[4] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[5] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[6] & 0xFF; 
tempLow <<= 8; 
tempLow |= buffer[7] & 0xFF; 

sum |= ((tempHigh & 0xFFFF) <<= 32) + (tempLow & 0xFFFF); 

どのようにすることができますを与えるC.

でそのことは容易ではないと仮定したJavaで

この手順は正しく行われますまたは私は行ったエラーを解決しますか?

ありがとうございます。

答えて

2

それを行うためのポータブルな方法は、指数を適用するためにldexpを呼び出し、その後、ビット単位の演算と整数の変数に符号、指数、および仮数の値を読み出すことです。

OK、ここにいくつかのコードがあります。カッコが一致していないか、オフラインでエラーが発生している可能性があることに注意してください。

unsigned char x[8]; // your input; code assumes little endian 
long mantissa = ((((((x[6]%16)*256 + x[5])*256 + x[4])*256 + x[3])*256 + x[2])*256 + x[1])*256 + x[0]; 
int exp = x[7]%128*16 + x[6]/16 - 1023; 
int sign = 1-x[7]/128*2; 
double y = sign*ldexp(0x1p53 + mantissa, exp-53); 
+0

例を挙げてください。今私はサインの問題を見る。 – JavaCake

+0

ビッグエンディアンの場合は、すべてを反転する必要がありますか? – JavaCake

+0

*データ*がビッグエンディアンの場合は、配列のオフセットを反転する必要があります。このコードはマシンのエンディアンと100%独立しています。 –

3

doubleは浮動小数点型です。 |などのビット単位の演算はサポートされていません。

あなたのような何かを行うことができます:

double sum; 

memcpy(&sum, buffer, sizeof(sum)); 

をしかし、エンディアンの問題に注意してください。

+0

あなたは他にも何か提案できますか?ありがとう。 – JavaCake

2

組合はどうですか?あなたが持っているように長い部分に書くと、ダブルは自動的に正しいです。このような何か:

union 
{ 
    double sum; 
    struct 
    { 
     long tempHigh; 
     long tempLow; 
    }v; 
}u; 

u.v.tempHigh = 0; 
u.v.tempHigh |= buffer[0] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[1] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[2] & 0xFF; 
u.v.tempHigh <<= 8; 
u.v.tempHigh |= buffer[3] & 0xFF; 

u.v.tempLow |= buffer[4] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[5] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[6] & 0xFF; 
u.v.tempLow <<= 8; 
u.v.tempLow |= buffer[7] & 0xFF; 

printf("%f", u.sum); 
関連する問題