大小端轉換C 實現

2021-10-01 06:18:28 字數 985 閱讀 6876

#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位,將其放置到第...