3

プログラミングのテストでなぞなぞを解こうとしています。

免責事項: これは就職試験ですが、答えを求めているわけではありません。これを行う方法の理解を求めているだけです。このテストでは、一連の問題に対する一連の解決策を 2 週間以内に考え出す必要があり、単独で解決策に到達する必要はありません。

だから、問題:

次のようにビットが配置された32ビットの数値があります。

siiiiiii iiiiiiii ifffffff ffffffff

どこ:

  • s は符号ビット (1 == 負)
  • i は 16 整数ビット
  • f は小数部の 15 ビット

割り当ては、32 ビット整数を浮動小数点数にデコードするものを書き込むことです。次の入力が与えられると、次の出力が生成されます。

input            output

0x00008000   1.0
0x80008000  -1.0
0x00010000   2.0
0x80014000  -2.5
0x000191eb  3.14
0x00327eb8    100.99

数値の符号ビットまたは整数部分を取得するのに問題はありません。次のような符号ビットを取得します。

boolean signed = ((value & (1 << 31)) != 0);

次のように整数部分と小数部分を取得します。

int wholePart = ((value & 0x0FFFFFFF) >> 15);

int fractionPart = ((value & 0x0000FFFF >> 1));

私が問題を抱えている部分は、最後の 15 ビットの数値を取得して、期待値と一致させることです。3.14 の代わりに、3.4587 などを取得します。

誰かが私が間違っていることについてヒントをくれたら、それを感謝します。何よりも、何時間もいじった後もこれを理解できなかったという事実は、私を一種の狂気に駆り立てます. :-)

4

5 に答える 5

4

会社のインプットは間違っていません。小数ビットは、小数点の右側のリテラル桁を表すのではなく、小数部分を表します。それをあきらめずにそれを言う方法が他にわかりません。分断が関係していると言うのは大きすぎるヒントでしょうか?

于 2009-11-09T03:25:43.757 に答える
2

いくつかのこと...

小数部分を次のように取得しないのはなぜですか

int fractionPart = value & 0x00007FFF;  // i.e. no shifting needed...

同様に、サインのシフトは必要ありません

boolean signed = ((value & (0x80000000) != 0);  // signed is true when negative

小数部分の効果的な使用法については、Ryan の回答を参照してください。つまり、これを小数部分の数値として文字どおりに解釈するのではなく、小数部分を含む一部の値を使用してください...

于 2009-11-09T03:15:16.873 に答える
1

シフトの前に、分数部分を何と合わせているかを見てください。

于 2009-11-09T03:14:11.287 に答える
0
int wholePart = ((value & 0x7FFFFFFF) >> 15);

int fractionPart = (value & 0x00007FFF);

バイナリ モードでビットマスクを電卓にキー入力し、それを 16 進数に反転します...

于 2009-11-09T03:13:10.740 に答える
0

Shift Right 31 は、符号付きビット 1=Neg 0=Pos を提供します。

BEFORE siiiiiii iiiiiii ifffffff ffffffff
SHR 31 00000000 00000000 00000000 0000000s

左に 1 をシフトし、次に右に 16 をシフトすると、整数ビットが得られます。

BEFORE siiiiiii iiiiiii ifffffff ffffffff
SHL 1 iiiiiiiiiiiiiiii ffffffff fffffff0
SHR 16 00000000 00000000 iiiiiii iiiiiii

Shift Left 17 の後に Shift Right 15 が続くと、Faction ビットが得られます。

BEFORE siiiiiii iiiiiii ifffffff ffffffff
SHL 17 ffffffff fffffff0 00000000 00000000
SHR 16 00000000 00000000 0ffffffffffffffff

于 2009-11-09T03:36:47.137 に答える