3

我有一些自然的双倍大数字。我需要得到它最右边的 30 位(不可分割的部分)。如果它是整数,则操作是:

var & 0x3FFFFFFF

我可以为此目的实现一些功能,但我需要一些简单的解决方案。有吗?

*编辑:

所有的答案都不适合我。我将尝试解释:例如,我有双 x = 9362446620820194.0000,该数字的整数部分的最右边 30 位是数字 957350626。

我可以使用 uint64_t 而不是 double,但我需要支持 32 位系统。

ps 我的意思是简单的二进制数表示,而不是机器(内存)

4

2 回答 2

2

假设 8 位unsigned char

unsigned char const *p = (unsigned char const *)&var;
long rightmost30 = (p[sizeof(double) - 4] & 0x3F) << 24
                 |  p[sizeof(double) - 3] << 16
                 |  p[sizeof(double) - 2] << 8
                 |  p[sizeof(double) - 1];

虽然真的,你应该看看frexp和相关的功能。

于 2012-03-11T12:31:48.250 回答
0

铸造技巧:

float var = 0.2987647892;
uint32_t bit_repr = *(uint32_t *)&var;
uint32_t masked = bit_repr & 0x3FFFFFFF;
于 2012-03-11T12:24:23.607 回答