2011年6月14日 星期二

[c][程式]處理2進位混合資訊

最近遇到有人把3個資訊編到一個變數裡。
他們是這樣做的:
0001 0000010 00100
上面是一個16個bit,分成3節。
第1節就當做是section,第2節當做變數id,第三節當做步驟順序。
因為這3節是各自獨立,因此是三個獨立軸,這16bit展開成一個空間。

當我們拿到這一個16bit的東西的時候,在程式裡是整數,
也就是看到的時候是 4164,我們要怎麼處理這種東西呢?

當然一個最直覺的做法是,轉成2進位!
是的,腦筋是可以轉成2進位,但是寫c語言,我們不知道怎麼寫2進位的表示法。
if (a == ‘00100’) //這東西我不知道怎麼寫出來。
那寫成16進位呢?2進位轉16進位是一次4bit,又遇到不是4bit的一組,
導致很難處理。

有人大嘆一句為什麼不是10進位?10進位就好做了!
為什麼10進位就好做?
因為上面的數字是10進位,
要找到section,就是數字除10的12次方,
要找到變數id,就是數字除10的5次方。

對,10進位會做,為什麼2進位不會做?
只是被進位系統搞暈了。
4164 除 2的12次方,也會等於section。
4164 除 2的 5次方,也會等於變數id。

用整數的加減乘除就可以把三個值分別找出來。
0001 0000010 00100 = 4164
section = 4164 / 4096 = 1 //只要整數部份,小數直接捨去
變數id = (4164 – 1 * 4096) / 32 = 2 //只要整數部份,小數直接捨去
步驟順序 = (4164 -  1 * 4096 – 2 *32) = 4 //只要整數部份,小數直接捨去

有常寫c語言的人,一定還會弄出一招,就是bitwise的operation,&還有>>。
想法切入點不一樣,結果會是一樣的。

沒有留言:

張貼留言