双精度浮点数转十六进制C++源码

最近碰到个项目需要用到浮点数与16进制互转,记录一下。

下面是双精度浮点数转16进制代码:
符号位:63,指数位:62 ~ 52,尾数位: 51 ~ 0;

单精度转16进制同理,位数不同:
符号位:31,指数位:30 ~ 23,尾数位: 22 ~ 0;

unsigned long long double2hex(double db, string& strHex)
{
	map<int,char> buf;
	buf.clear();

	//符号位s
	int s = db > 0 ? 0 : 1;
	buf[0] = s;

	db = fabs(db);

	//算出指数位e
	int a = abs(db);
	int e = 0;
	if (a >= 1)
	{
		while (a / 2 > 0)
		{
			a = a / 2;
			e++;
		}
	}
	else
	{
		do
		{
			db *= 2;
			e--;
		} while (db < 1);
	}
	e += 1023;
	
	//将e换算为11位指数位
	vector<int> vT;
	vT.clear();
	while (e / 2 > 0)  //整数转二进制取余
	{
		vT.push_back(e%2);
		e = e / 2;
	}
	vT.push_back(e);
	reverse(vT.begin(), vT.end());  //余数反向
	while (vT.size() < 11)
	{
		vT.insert(vT.begin(),0);
	}

	int i = 1;  //buf[1-11]
	for (auto it = vT.begin(); it != vT.end(); it++)
	{
		buf[i] = *it;
		i++;
	}

	//52位尾数位
	vT.clear();
	a = abs(db);
	while (a / 2 > 0) //整数部分转二进制:除以2取余数
	{
		vT.push_back(a % 2);
		a = a / 2;
	}
	vT.push_back(a);
	reverse(vT.begin(), vT.end()); //余数反向
	vT.erase(vT.begin());          //去掉第一位隐藏位

	double b = db - int(db);
	for (int i = 0; i < 52; i++)  //小数部分转二进制:每次循环用小数部分乘以2取整数部分
	{
		double b2 = b * 2;
		int T = b2;
		b = b2 - T;
		vT.push_back(T);
	}
	
	i = 12;  //buf[12-63]
	for (auto it = vT.begin(); it != vT.end(); it++)
	{
		buf[i] = *it;
		i++;
	}

	//转成16进制
	unsigned long long lHex = 0;
	for (int i = 0; i < 64; i++)
	{
		lHex = (lHex << 1) | buf[i];
	}

    //转成16进制字符串
	std::string _strHex;
	for (int i = 0; i < 64; i=i+8)
	{
		byte byteT = 0;
		for (int j = i; j < i+8; j=j++)
		{
			byteT = (byteT << 1) | buf[j];
		}
		_strHex += byteT;
	}
	strHex = _strHex;
	
	return lHex;
}

参考引用:ieee754二进制转换为十进制
跳转:十六进制转单双精度浮点数代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值