对浮点数进行位移
Posted
技术标签:
【中文标题】对浮点数进行位移【英文标题】:Bit shifting a floating-point 【发布时间】:2021-12-29 10:03:40 【问题描述】:我正在做一个将任何实数转换为定点的项目。
例如下面的代码:
float ff = 8.125f;
std::cout << std::bitset<32>(ff) << std::endl; //print binary fotmat
输出:
00000000000000000000000000001000
只打印整数部分。
当我这样做时:
float ff = 8.125f;
int va = ff * (1 << 8); //8bits shift left
std::cout << std::bitset<32>(va) << std::endl; //print binary fotmat
输出是:
00000000000000000000100000100000
小数部分也打印出来了。
我不明白为什么。
【问题讨论】:
这能回答你的问题吗? c++ bit shifting a float 【参考方案1】:只打印出整数部分。
当然,因为这就是你给bitset
:there is no std::bitset
constructor that takes a float
argument 的所有内容,所以你的ff
正在转换为unsigned long long
,这将丢失小数部分(因为任何转换为将浮点类型转换为整数类型)。打开编译器警告会提醒您这一点;例如,对于您的第一个代码 sn-p,MSVC 编译器显示:
警告 C4244:“参数”:从“浮点”转换为“无符号” __int64',可能会丢失数据
在第二个示例中,您将 float
值乘以 256 并转换为整数值 2080
- 这是传递给 bitset
的值。
如果您希望在bitset
中获得float
变量的完整 位表示,您需要首先将该数据复制到unsigned long long
变量中并将其传递给构造函数:
unsigned long long ffdata = 0;
std::memcpy(&ffdata, &ff, sizeof(ff));
std::cout << std::bitset<32>(ffdata) << std::endl;
输出:
01000001000000100000000000000000
【讨论】:
天哪,是的..我很愚蠢!谢谢~~~非常感谢以上是关于对浮点数进行位移的主要内容,如果未能解决你的问题,请参考以下文章