负数补码_不定长有符号数解析

第一种方法,采用位操作

/* 描述:     将无符号数的编码按有符号数解析,用于解析以有符号数格式编码但又不是8位,16位,32位对齐的数。          */
/*           解析完的数是32位有符号数。                                                                   */
/* 输入:                                                                                               */
/*           uint32_t  data: 信号的原始值,二进制编码                                                     */
/*           uint8_t   n   : 信号的bit_length, 要转换的有符号数是多少位的                                  */
/* 返回值:                                                                                             */
/*           int32_t 类型, 解析完成的带有正负号的信号值。                                                 */
/* 注意:     n最大为32,最小为2。                                                                        */
int32_t singed_data_decode(uint32_t data,uint8_t n)
{
	int32_t  ret;
	uint32_t bit_mask = 1 << (n-1);
	if(data & bit_mask)                               // 判断符号位
	{
		ret = (int32_t)(data | (~(bit_mask - 1)));    // 这一步求出就是负数的补码
	}
	else
	{
		ret = (int32_t)data;
	}
    return ret;
}

第二种方法,采用数值运算

/* 描述:     将无符号数的编码按有符号数解析,用于解析以有符号数格式编码但又不是8位,16位,32位对齐的数。          */
/*           解析完的数是32位有符号数。                                                                   */
/* 输入:                                                                                               */
/*           uint32_t  data: 信号的原始值,二进制编码                                                     */
/*           uint8_t   n   : 信号的bit_length, 要转换的有符号数是多少位的                                  */
/* 返回值:                                                                                             */
/*           int32_t 类型, 解析完成的带有正负号的信号值。                                                 */
/* 注意:     n最大为32,最小为2。                                                                        */
int32_t singed_data_decode(uint32_t data,uint8_t n)
{
	int32_t  ret;
	uint32_t bit_mask = 1 << (n-1);
	if(data & bit_mask)                                   // 判断符号位
	{
		ret = (-1) * ((int32_t)((bit_mask << 1)-data));   // -1 乘以负数的绝对值,得到负数的最终结果
	}
	else
	{
		ret = data;
	}
	return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值