在C中提取双最右边的N位

时间:2012-03-11 12:19:36

标签: c bit-manipulation bitwise-operators bitwise-and

我在double中有一些自然大号。我需要得到30个最右边的部分(整体部分)。 如果它是整数,则操作是:

var & 0x3FFFFFFF

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

*编辑:

所有答案对我都不起作用。 我将尝试解释:例如,我有双x = 9362446620820194.0000,该数字的最右边的30位是数字957350626。

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

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

2 个答案:

答案 0 :(得分: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及相关功能。

答案 1 :(得分:0)

铸造黑客:

float var = 0.2987647892;
uint32_t bit_repr = *(uint32_t *)&var;
uint32_t masked = bit_repr & 0x3FFFFFFF;