erlang的二進位制使用學習

2021-06-22 11:49:21 字數 3196 閱讀 6475

erlang 二進位制

最近因工作要求,需要使用erlang程式語言進行程式開發,不過一直沒

有機會應用erlang的二進位制使用,個人感覺erlang的二進位制功能很強大,

但是裡面有些知識點比較拗口,一不小心就模糊了相關的使用規則,下

面列出其使用方式以備忘記:

1.將乙個整數強制拆分成指定長度的二進位制表示:

1>bin =  <<17:15>>.

<<0,17:7>>

本來將整數:17用二進位制表示,乙個8bit的方式即可完整表示出來,現

在強制要求用15bit來表示,則高位補0,低位是 7bits的位元流即可。

2. <> = <<59704:16>>.

d:233

e:<<"8">>

其中d是以10進製表示,所以返回為233,e以2進製表示,所以返回為

二進位制格式。

3. bitstring的用法:

1>  <> = <<59704:16>>.

<<"é8">>

2> a.

<<"é">>

3> b.

56通過上面的效果可以知道,在進行二進位制匹配時,如果繫結變數的

type不同,返回的型別也是不同的。

4.二進位制的type型別: integer、bits、bitstring:這3種型別預設1單位所佔

bit位為1位,可以通過設定unit:n來更改預設設定, 例如:<> = <<17:16>>

至於float型別,測試時總報異常,一時沒找到原因,此處不列出來。

binary、bytes:這兩類預設占用bit位為8位,同上,可以通過設定unit的值更改預設值。

unit:可以通過此屬性設定每單位占用的bit位數,該值允許的範圍為

1~255。

size:進行位元位匹配時使用格式類似:<>,其中

size代表占用多少個單位的unit,其中每個unit單位預設所佔bit位在上面

有說明,那麼當前value總共所佔bit位數目為: size * unit。

endian屬性:可選值為big | little | native,當值為big時,按照2進製資料從左到右的正常次序每隔

1> 2#011000001110100110011010. [01100000,11101001,10011010] 

6351258

2> <> = <<6351258:23>>.

<<193,211,26:7>>

3> a.

793907

4> b.

25> 2#11000001110100110011. [11000001,11010011,0011]

793097

6> <> = <<6351258:23/little>>.

<<154,233,96:7>>

8> c.

634524

9> d.

010> 2#10011010111010011100. [10011010,11101001,1100]

634524

11> 2#011000001110100110011010. [01100000,11101001,10011010]

6351258

12> <> = <<6351258:23/little>>.

<<154,233,96:7>>

13> e.

414> f.

881888

15> 2#100

416> 2#11010111010011100000. [11010,11101001,1100000]

881888

這個測試會讓人比較迷惑,不過通過觀察資料可以得到規律:

二進位制資料流總是傾向於以8位元為乙個組合;

二進位制資料流中,每乙個8位元位的單組中,從左往右,左側總是高位,右側總是低位,無論上面的endian型別為big或者little;

當將乙個整數轉換為乙個非對齊的bit流(例如上面將本應設定為24bit位的整數6351258,強制設定為23bit)時,可以根據如下的模型設想其砍掉多餘的bit位的情況,我們先看例項:

1> <<6351258:23/little>>.

<<154,233,96:7>>

2> 2#011000001110100110011010. [01100000,11101001,10011010]

6351258

3> 2#10011010.

1544> 2#11101001.

2335> 2#01100000.

966> <<6351258:23/big>>.

<<193,211,26:7>>

7> 2#11000001.

1938> 2#11010011.

2119> 2#00011010.

26總結:上面的測試給我們這樣的推斷:

無論endian型別為big模式或者little模式,可以先按照big模式取得整數的

二進位製流,該二進位製流是對齊的模式,也就是二進位製流長度為8的倍數,然後砍掉二進位製流最左側的多出來的bit位(記住:無論是big模式還是little模式),獲取最新的bit流資訊。

接下來,當為big模式時,在新big流的基礎上,從左往右,每8位bit資料作為一組,當最後的bit流長度不足8位時,為其在左側高位補0;並且這產生的多個bit組合中,越往左側的越是高位,最後乙個bit組是最低位;

當為little模式時,需要從右往左進行分組,每8bit位資料位一組,最右側的組合是高位,中間的是次高位,最左側的是最低位。

經過上面的分析後,我們現在可以接著看最上面的二進位制匹配情況,當endian模式為big模式時,變數a將匹配二進位制資料流的最高位資料,其提取20個bit位,這解釋了為什麼變數a繫結整數:634524;b變數繫結整數:2。

當endian模式為little模式時,變數c一樣匹配二進位制資料流的最高位資料,最高位資料流按照bit組來組合,卻是從big模式下的最右側開始組合:首先最右側的8位作為最高位,然後是中間的8位作為次高位,組後是最左側7bit中的高4位:1100,這解釋了為什麼變數c的值為634524而d變數的值為0,如果還不確定這種理解是否正確,還可以參考後面變數e和f的匹配情況。

5.二進位制資料流的匹配方式:

1> 2#11010011.

2112> <<2#1101:4,x:4>> = <<211>>.

<<"ó">>

3> x.

3至於二進位制中的sign屬性,目前還沒有進行測試,有興趣的朋友可以將測試結果分享一下。

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

Erlang筆記 二進位制 位元位語法

看erlang的語法看到二進位制處理部分覺都很有意思,做個記錄 存在於很多函式式程式語言之中的列表速構的思想,也被擴充套件到了erlang的位元位語法中。位串速構酷似列表速構,只是 被換成了 以乙個小整數列表為例,所有整數都在0和7之間,你可以按每個數3位元位將它們打包成位串,如下 x 3 x 1,...

Erlang腳印 0006 二進位制位串

位串可以寫作 e1,e2.en 其中雙小於號和雙大於號之間可以包含零個或多個區段指示符,位串以位元位為單位的整體長度。區段指示符可以為以下形式之一 data data size data typespecifiers data size typespecifiers typespecifiers 主...