簡單實用演算法 位元組位序反轉

2021-10-13 18:31:35 字數 1903 閱讀 3327

演算法概述#

反轉乙個位元組說的是位序反轉,別將它和大端轉小端混淆了,所謂大端和小端指的是位元組序。

位元組位序反轉的實現vb.net教程演算法很多,就是看看誰的演算法效率更高了。

高手不是能寫出最美麗的程式而是能寫出既美麗同時效率又是最高的程式。

如果乙個人寫的程式很美麗,很直觀,只能說明該程式設計師對語言掌握的很好,但是語言畢竟只是工具,真正做事的是計算機,只有對計算機很了解,才能寫出效率最高的程式。

正如文學家的文筆很多不如花季少女,但是花季少女永遠也超越不了時代。

演算法太多,這裡只列出我掌握的一些,下面的演算法名稱是我自己取的不要當真。

演算法實現#

分治法並行反轉#

它的演算法是這樣的:

首先是2位2位為一組,交換前一半和後一半。

再4位4位為一組,交換前一半和後一半。

再8位為一組,交換前一半和後一半。

比如說,將1 2 3 4 5 6 7 8 反轉為8 7 6 5 4 3 2 1:

2個2個為一組,交換前一半和後一半, 變成:2 1 4 3 6 5 8 7

4個4個為一組,交換前一半和後一半, 變成:4 3 2 1 8 7 6 5

再8個為一組,交換前一半和後一半, 變成:8 7 6 5 4 3 2 1

**如下:

static

byte

reversebits

(byte c)

由於c#語言特性,**中強制轉換c#教程較多:

由於移位運算子僅針對 int、uint、long 和 ulong 型別定義,因此運算的結果始終包含至少 32 位。 如果左側運算元是其他整數型別(sbyte、byte、short、ushort 或 char),則其值將轉換為 int 型別。

小表查表法#

相比於分治法並行反轉,它通過乙個長度為16的表直接獲取分治法並行反轉的前兩步交換操作的結果,使用了一點空間換取時間。

//不多不少的靜態資料

static

byte

sta_4 =

newbyte[16

];static

byte

reversebits

(byte c)

全表查表法#

簡單粗暴,列出所有可能的結果(256個值),直接以要處理的值為索引在結果表中查詢位元組位序反轉後的值。

此方法只適用於有大量資料需要處理的場景,錶值是我使用前面的演算法得到的。

static

byte

sta_8 =

newbyte

[256];

static

byte

reversebits

(byte c)

64位內資料位序反轉#

演算法主要步驟是從待處理值中取位值(按從低位到高位的順序)依次存入結果值當中(按從高位到低位的順序),總之取值、存值的順序相反即可。

此演算法**支援64位內的任意二進位制值的位序反轉,**如下:

//valuelength是待處理值的位數,如uint是32位資料

static

uint64

reversebits

(uint64

value

,int32 valuelength)

return output;

}

任意位資料位序反轉#

其實經過上面的幾個演算法,我們可以發現對於任意位的二進位制資料位序反轉都可以歸為兩個步驟:

以位元組為單位將資料進行位元組序反轉

依次對單個位元組進行位序反轉

參考文章#

反轉乙個位元組(詳細解析)——csdn

筆試題–反轉乙個位元組——csdn

出處:

反轉位元組中的位

使用有限的記憶體操作完成位元組中的位反轉。完成後,修改 讓它執行得盡可能快 但沒有記憶體限制 優化和正確性相比,總是居於次要位置。uint8 t swapbitsinbyte uint8 t input uint8 t output 0 for uint8 t i 0 i 8 i if input ...

位反轉演算法

比如0x12 0001 0010 反轉後變成 0100 1000 即0x48 static unsigned char buf 0x12,buf1 0 static int m,n for m 7,n 0 m n 0 m n buf buf1 將兩位元組short型別數高低位元組取出來 unsign...

位元組按位倒序處理(二)

前一篇的位元組倒序是用for迴圈處理的,雖然也可以實現倒序,當相對低效,乙個位元組需要迴圈8次,每次迴圈內部又有6條指令,完成乙個位元組倒序都有執行48條指令。這裡提供另一種方法,相對於for迴圈高效不少,只需執行13條指令即可完成倒序,具體 如下圖。uint8 t byte change uint...