浮点位移位
Bit shifting a floating-point
我正在进行一个将任何实数转换为定点数的项目。
例如下面的代码:
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
小数部分也打印出来了。
我不明白为什么。
Only the integer part is printed out.
嗯,当然,因为这就是你给 bitset
的全部内容:there is no std::bitset
constructor that takes a float
argument,所以你的 ff
正在转换为 unsigned long long
,这将丢失小数部分(因为任何浮点类型到整数类型的转换都会)。打开编译器警告会提醒您这一点;例如,对于您的第一个代码片段,MSVC 编译器显示:
warning C4244: 'argument': conversion from 'float' to 'unsigned
__int64', possible loss of data
在您的第二个示例中,您将 float
值乘以 256 并转换为整数值 2080
- 这是传递给 bitset
的值。
如果您想要 float
变量在 bitset
中的 完整 按位表示,您需要先将该数据复制到 unsigned long long
变量并将其传递给构造函数:
unsigned long long ffdata = 0;
std::memcpy(&ffdata, &ff, sizeof(ff));
std::cout << std::bitset<32>(ffdata) << std::endl;
输出:
01000001000000100000000000000000
我正在进行一个将任何实数转换为定点数的项目。
例如下面的代码:
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
小数部分也打印出来了。
我不明白为什么。
Only the integer part is printed out.
嗯,当然,因为这就是你给 bitset
的全部内容:there is no std::bitset
constructor that takes a float
argument,所以你的 ff
正在转换为 unsigned long long
,这将丢失小数部分(因为任何浮点类型到整数类型的转换都会)。打开编译器警告会提醒您这一点;例如,对于您的第一个代码片段,MSVC 编译器显示:
warning C4244: 'argument': conversion from 'float' to 'unsigned __int64', possible loss of data
在您的第二个示例中,您将 float
值乘以 256 并转换为整数值 2080
- 这是传递给 bitset
的值。
如果您想要 float
变量在 bitset
中的 完整 按位表示,您需要先将该数据复制到 unsigned long long
变量并将其传递给构造函数:
unsigned long long ffdata = 0;
std::memcpy(&ffdata, &ff, sizeof(ff));
std::cout << std::bitset<32>(ffdata) << std::endl;
输出:
01000001000000100000000000000000