如何将十六进制转换为 IEEE754 二进制格式?

问题描述 投票:0回答:1

我试图了解如何使用 IEEE754 标准将浮点数(例如 5.1 )转换为 C++ 中的二进制形式。

根据我的理解,

5.1
中的
IEEE754
应该使用
0 10000000001 0100011001100110011001100110011001100110011001100110
来表示。

我尝试使用以下函数获取该格式

std::string hexToBinaryIEEE754(const std::string& hexStr) {
    // Convert hex string to unsigned long long
    unsigned long long hexValue = std::stoull(hexStr, nullptr, 16);

    // Convert hex value to IEEE 754 binary representation
    std::bitset<64> bits(hexValue);
    return bits.to_string();
}

不幸的是返回的值是

0100000000010100011001100110011001100000000000000000000000000000

关于如何以二进制格式返回的任何想法都可以在

CVC5
等函数中使用:

Term v =  slv->mkBitVector(32, <value>);

谢谢

c++ ieee-754
1个回答
0
投票

假设机器的常见架构是二进制补码、大端或小端、以及 8 位到一个字节。如果您可以相信机器的浮点型和双精度型内部存储确实是 IEEE754,那么您可能只需枚举值地址处的位即可。

类似这样的事情。

bool isBigEndian() {
    return htons(1234) == 1234;   // include <winsock2.h> or <arpa/inet.h>
}

template<typename T>
std::string numberToBitString(T value) {
    std::string s;
    const uint8_t len = sizeof(value);
    uint8_t tmp[len];
    uint8_t* ptr = (uint8_t*)&value;

    // fixup for little endian machines (Intel, Mac Native Silicon, etc...)
    if (!isBigEndian()) {
        for (size_t i = 0; i < len; i++) {
            tmp[sizeof(value) - 1 - i] = ptr[i];
        }
        ptr = tmp;
    }

    // enumerate the bits from MSB to LSB on each byte
    for (size_t i = 0; i < len; i++) {
        for (size_t j = 0; j < 8; j++) { // 8 bits in a byte
            unsigned int mask = 0x80 >> j;
            s += (ptr[i] & mask) ? "1" : "0";
        }
    }
    return s;
}

int main() {
    const double value = 5.1;
    std::string s = numberToBitString(value);
    std::cout << value << " = " << s << "\n";
    return 0;
}

上面将打印出:

5.1 = 0100000000010100011001100110011001100110011001100110011001100110
© www.soinside.com 2019 - 2024. All rights reserved.