我正在尝试解决编程测试中的谜题。
免责声明:这是对工作的考验,但我不是在寻找答案。我只是想了解如何做到这一点。测试要求我在2周内为一系列问题提出一套解决方案,并没有说明我要求单独解决这些问题。
所以,问题是:
我有一个32位数字,其位排列如下:
siiiiiii iiiiiiii ifffffff ffffffff
其中:
赋值是写一个将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等。
如果有人能给我一些关于我做错的提示,我会很感激。最重要的是,事实上我在经过几个小时的捣乱之后还没有想到这一点,这让我疯狂。 : - )
答案 0 :(得分:4)
公司的意见没有错。小数位不代表小数点右边的字面数字,它们代表小数部分。不知道如何在不放弃的情况下说出来。如果说存在分歧会不是太大的暗示呢?
答案 1 :(得分:2)
一些事情......
为什么不将小数部分作为
int fractionPart = value & 0x00007FFF; // i.e. no shifting needed...
同样,标志不需要转移
boolean signed = ((value & (0x80000000) != 0); // signed is true when negative
请参阅Ryan对有效使用小数部分的回应,即不将字面意思视为小数部分的数字值,而是......某些'涉及分数...
答案 2 :(得分:1)
在轮班之前看一下你所处的分数部分。
答案 3 :(得分:0)
int wholePart = ((value & 0x7FFFFFFF) >> 15);
int fractionPart = (value & 0x00007FFF);
在二进制模式下将位掩码键入Calculator,然后将其翻转为Hex ...
答案 4 :(得分:0)
Shift Right 31为您提供有符号位1 = Neg 0 = Pos
BEFORE siiiiiii iiiiiiii ifffffff ffffffff SHR 31 00000000 00000000 00000000 0000000s
左移1然后右移16给出整数位
BEFORE siiiiiii iiiiiiii ifffffff ffffffff SHL 1 iiiiiiii iiiiiiii ffffffff fffffff0 SHR 16 00000000 00000000 iiiiiiii iiiiiiii
左移17然后右移15给出了阵营位
BEFORE siiiiiii iiiiiiii ifffffff ffffffff SHL 17 ffffffff fffffff0 00000000 00000000 SHR 16 00000000 00000000 0fffffff ffffffff