加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

在C++中如何得到浮点数的二进制表示形式

(2016-06-07 15:23:24)
标签:

float_to_binary

bitset

union

分类: C_Plus_Plus
在C++中我们可以直接对整形数据进行位操作,例如左移,右移,按位与,按位或等操作,但是如何对浮点形式的数据进行位操作呢?要想对浮点类型的数据进行位操作首先需要得到其二进制表示形式,以下介绍三种方式来得到一个浮点数的二进制表示形式。

浮点数在机器中的表示参考:http://blog.sina.com.cn/s/blog_a2a6dd380102vai9.html.

注:以下代码均在编译器Dev-C++ 5.6.1上编译通过。
  
(1)使用reiniterpret_cast将float类型转换为int类型 (前提:float和int有同样大小的size)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include < cassert >
#include < iomanip >
#include < iostream >
#include < ostream >

using namespace std;

int main()
{
  
  
float pi 1.1;
  
int   ipi;

  cout << setfill(
'0'<< showbase << hex << internal;

  assert(
sizeof(int== sizeof(float));
  ipi 
reinterpret_cast<<span style="color:#8000ff;">int&>(pi);
  cout << 
"pi bits=" << setw(10<< ipi << '\n';

}

运行结果如下:
    pi bits=0x3f8ccccd
   
(2)利用union的特点来保存数据,得到浮点数的二进制表示形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include < iostream >
#include < string >
#include  < inttypes.h >// for uint32_t
using namespace std;

void floatToBinary(float f, string& str)
{
    
union float f; uint32_t i; u;
    u.f f;
    str.clear();

    
for (int 032i++)
    {
        
if (u.i 2 str.push_back('1');
        
else str.push_back('0');
        u.i >>= 
1;
    }

    
// Reverse the string since now it's backwards
    string temp(str.rbegin(), str.rend());
    str temp;
}
int main(int argc, const charargv[])
{
    string str;
    
float f;
    
while (true{
        cin >> f;
        floatToBinary(f, str);
        cout << str << endl;
    }
    
return 0;
}
运行结果如下:
        
37.73
        
01000010000101101110101110000101
        
2.0
        
01000000000000000000000000000000
        
237.74 

(3)结合unionbitset来进行操作,得到浮点数的二进制表示形式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include < iostream >
#include < bitset >

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

    data.input 
2.25125;

    std::bitset<<span style="color:#0000ff;">sizeof
(floatCHAR_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;
}

    运行结果如下:
        
01000000000100000001010001111011
        BIT 
41
        BIT 
70

参考资料:

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有