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 主...