Qm.n型数据和16bit以内的任意转换

这段代码包含两个转换函数:intGetIs()用于检查指定位置的位是否为1,getQMN()则将16位数值转换为浮点数,然后进一步转换为16进制。转换过程中涉及位移、位运算以及正负数的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int  GetIs(ushort val,int n)
		{
			if (((val >> n) & 1) == 0) return 0;
			else return 1;
		}

//最大支持 16bit 转 浮点数
float GetQMN(int m, int n,ushort val1)
	{
			ushort val;
			if ((val1 & (1<<(m+n-1))) == 0)//如果最高位是0表示正数
			{
				val =val1;
			}
			else//负数
			{
				val = (ushort)( (~val1) + 1);
			}

			//负数 才用补码计算
			float tmp = 0;
			for (int i = 0; i < n; i++)//n=8
			{
				tmp += (float)(GetIs(val, i) * Math.Pow(2, i-n));
			}
			for (int i = 0; i < m; i++)//n=8
			{
				tmp += (float)(GetIs(val, n+i) * Math.Pow(2, i));
			}
			if ((val1 & (1 << (m + n - 1))) == 0)//如果最高位是0表示正数
			{
			
			}
			else//负数
			{
				tmp = tmp * -1;
			}
			return tmp;
		}



		//最大支持 16bit 转 16进制数据
		ushort GetQMN(int m, int n, float tmp)
		{
			
			ushort num = 0;
			ushort num2 = 0;
			ushort bitx = 0;
			int i;
			for (i = 0; i < n; i++)
			{
				bitx = (ushort)((Math.Abs(tmp) / Math.Pow(2, i - n))); num |= (ushort)(bitx << i);
			}
			for (i = 0; i < (m - 1); i++)
			{
				bitx = (ushort)((Math.Abs(tmp) / Math.Pow(2, n + i - n))); num |= (ushort)(bitx << i + n);
			}
			if (tmp < 0) num = (ushort)(((~num)));
			num2 = 0;
			for (i = 0; i < (m + n - 1); i++)
			{
				num2 |= (ushort)(num & (1 << i));
			}
			num2 += 1;
			if (tmp < 0) num2 |= (ushort)(1 << (m + n - 1));
			return num2;
		}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值