浮点到二进制值(C++)

use*_*389 15 c++ floating-point binary ieee-754

我想在C++中使用浮点数,如2.25125,以及填充二进制值的int数组,该值用于将浮点数存储在内存中(IEEE 754).

所以我可以取一个数字,最后得到一个int num [16]数组,其二进制值为float:num [0]将是1 num [1]将是1 num [2]将是0 num [3 ]将是1等等......

将int放入数组并不困难,只需获取float的二进制值的过程就是我被困住的地方.你能不能在内存中读取float变量的二进制文件?如果没有,我怎么能用C++做这个呢?

编辑:这种方式进行比较的原因是我想学习在C++中进行逐位运算.

Mar*_*ork 22

使用union和bitset:

#include <iostream>
#include <bitset>
#include <climits>

int main()
{
    union
    {
        float input; // assumes sizeof(float) == sizeof(int)
        int   output;
    } data;

    data.input = 2.25125;

    std::bitset<sizeof(float) * CHAR_BIT> bits(data.output);
    std::cout << bits << std::endl;

    // or
    std::cout << "BIT 4: " << bits[4] << std::endl;
    std::cout << "BIT 7: " << bits[7] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它可能不是数组,但您可以使用[]运算符访问位,就像使用数组一样.

产量

$ ./bits
01000000000100000001010001111011
BIT 4: 1
BIT 7: 0
Run Code Online (Sandbox Code Playgroud)

  • @deft_code:C++是**NOT**spec'ed使用ieee754(它可以).Long是**NOT**spec'ed 32 bit(必须至少为32).这将永远不可移植,因为分配给联合中的一个字段并且从另一个字段中读取是未指定的行为.如果我对上述任何一个都不正确,请告诉我C++标准中定义它的条款,因为简单的搜索显示两个语句都是错误的. (7认同)

Meh*_*ari 14

int fl = *(int*)&floatVar; //assuming sizeof(int) = sizeof(float)

int binaryRepresentation[sizeof(float) * 8];

for (int i = 0; i < sizeof(float) * 8; ++i)
    binaryRepresentation[i] = ((1 << i) & fl) != 0 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

说明

(1 << i)将这个值1,i位向左边.该&运算符计算按位与操作数.

for循环的每个在浮子32位的运行一次.每次,i都将是我们想要从中提取值的位数.我们计算按位和数字,并1 << i:

假设数字是:1001011,和 i = 2

1<<i 将等于0000100

  10001011
& 00000100
==========
  00000000
Run Code Online (Sandbox Code Playgroud)

如果i = 3那样:

  10001011
& 00001000
==========
  00001000
Run Code Online (Sandbox Code Playgroud)

基本上,结果将是一个数字,其i位设置为i原始数字的第th位,所有其他位为零.结果将为零,这意味着i原始数字中的第n位为零或非零,这意味着实际数字的i第n位等于1.

  • @Konrad,它更短:)我回答的唯一目的是for循环中的一行.我不想用不必要的最佳实践来弥补答案. (2认同)

tes*_*t30 5

其他方法,使用 stl

#include <iostream>
#include <bitset>

using namespace std;
int main()
{
    float f=4.5f;
    cout<<bitset<sizeof f*8>(*(long unsigned int*)(&f))<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)