大小端轉換C++實現

#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的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章