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

右移 31 为您提供有符号位 1=Neg 0=Pos

之前 siiiiiii iiiiiiiii ifffffff ffffffff
SHR 31 00000000 00000000 00000000 0000000s

左移 1 后右移 16 为您提供整数位

之前 siiiiiii iiiiiiiii ifffffff ffffffff
SHL 1 iiiiiiiii iiiiiiiii ffffffff fffffff0
SHR 16 00000000 00000000 iiiiiiiii iiiiiiiii

左移 17 后右移 15 给出派系位

之前 siiiiiii iiiiiiiii ifffffff ffffffff
SHL 17 ffffffff fffffff0 00000000 00000000
SHR 16 00000000 00000000 0ffffffff ffffffff

于 2009-11-09T03:36:47.137 回答
0
int wholePart = ((value & 0x7FFFFFFF) >> 15);

int fractionPart = (value & 0x00007FFF);

以二进制模式将您的位掩码键入计算器,然后将其翻转为十六进制...

于 2009-11-09T03:13:10.740 回答