大小端转换C++实现

5 篇文章 0 订阅
#include <endian.h>

class Endness 
{
public:
	template<typename T16>
	static inline T16 swap16(const T16& v, BOOL desEndness)
	{
		if (!(__BYTE_ORDER == __LITTLE_ENDIAN ^ desEndness))
		{
			return v;
		}
		return ( (v & 0xff) << 8 ) | (v >> 8 & 0x00ff);
	}

	template<typename T32>
	static inline T32 swap32(const T32& v, BOOL desEndness)
	{
		if (!(__BYTE_ORDER == __LITTLE_ENDIAN ^ desEndness))
		{
			return v;
		}
		return (v >> 24 & 0x000000ff)
			| ((v & 0x00ff0000) >> 8 & 0x00ffffff)
			| ((v & 0x0000ff00) << 8)
			| (v << 24);
	}

	template <typename T64>
	static inline T64 swap64(const T64 &v, BOOL desEndness)
	{
		if (!(__BYTE_ORDER == __LITTLE_ENDIAN ^ desEndness))
		{
			return v;
		}
		return (v >> 56 & 0x00000000000000ff)
			| ((v & 0x00ff000000000000) >> 40 & 0x0000000000ffffff)
			| ((v & 0x0000ff0000000000) >> 24 & 0x000000ffffffffff)
			| ((v & 0x000000ff00000000) >> 8 & 0x00ffffffffffffff)
			| ((v & 0x00000000ff000000) << 8)
			| ((v & 0x0000000000ff0000) << 24)
			| ((v & 0x000000000000ff00) << 40)
			| (v << 56);
	}
};

注:在C++中位移分为逻辑位移和算术位移。

逻辑位移:不管左移还是右移,对于空缺位补的都是0。即无符号有左右移和有符号的左移。

算术位移:左移,空缺位补的是0。而右移,空缺位补的是符号位(1或0)。即负数右移补1,正数右移补0。

所以在负数位移运算中要特别小心,以上代码中每次右移做一次与运算(如(v >> 8 & 0x00ff)),就是为了解决负数右移补1的问题。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值