#include class endness
return ( (v & 0xff) << 8 ) | (v >> 8 & 0x00ff);
} templatestatic inline t32 swap32(const t32& v, bool desendness)
return (v >> 24 & 0x000000ff)
| ((v & 0x00ff0000) >> 8 & 0x00ffffff)
| ((v & 0x0000ff00) << 8)
| (v << 24);
} template static inline t64 swap64(const t64 &v, bool desendness)
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的問題。
巨集實現大小端轉換
定義多行巨集時在每一行後面加 define sw16 x short short x short 0x00ffu 8 short x short 0xff00u 8 假設x 0xaabb short x short 0x00ffu 與將16位數高8位置0 成了0x00bb 然後 8 向左移8位後 低...
大小端轉換
大小端轉換方法 include include define tranverse16 x uint16 x 0xff00 8 uint16 x 0x00ff 8 define tranverse32 x uint32 x 0xff000000 24 uint32 x 0x00ff0000 8 uin...
大小端轉換
short型別 public static short reverseushort short value 簡單分析一下 short型別占用16位,也就是兩個位元組,大小端只需要將兩個位元組互換一下就行。採用位操作,通過和 0x00ffu進行與運算,拿到第二個位元組的內容,然後左移8位,將其放置到第...