我在double中有一些自然大号。我需要得到30个最右边的部分(整体部分)。 如果它是整数,则操作是:
var & 0x3FFFFFFF
我可以为此目的实现一些功能,但我需要一些简单的解决方案。有吗?
*编辑:
所有答案对我都不起作用。 我将尝试解释:例如,我有双x = 9362446620820194.0000,该数字的最右边的30位是数字957350626。
我可以使用uint64_t而不是double,但我需要支持32位系统。
P.S。我的意思是简单的二进制数表示,而不是机器(内存)
答案 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;