从32位整数中提取数字

时间:2009-11-09 03:08:01

标签: bits

我正在尝试解决编程测试中的谜题。

免责声明:这是对工作的考验,但我不是在寻找答案。我只是想了解如何做到这一点。测试要求我在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等。

如果有人能给我一些关于我做错的提示,我会很感激。最重要的是,事实上我在经过几个小时的捣乱之后还没有想到这一点,这让我疯狂。 : - )

5 个答案:

答案 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