我們都知道計算機中數(shù)據(jù)存儲處理的基礎是二進制,這個是計算機讀寫用的,我們常用的是十進制,有時我們?yōu)榱朔奖愕谋硎居嬎銠C內(nèi)的數(shù)據(jù),所以又引入登錄十六進制。這里提醒大家的是普通計算機中能進行計算的有且僅有二進制數(shù)據(jù),其他進制數(shù)據(jù)都是轉(zhuǎn)換成二進制后再處理的。
我們還知道在很多語言編程中提供位運算,比如C/C++ , python 或者javascript, 那到底進制或者位運算在實際工作中會有哪些應用呢?
這里用例子進行一下介紹:
我們經(jīng)常遇見諸如 有M組IO口,每個IO口有多種狀態(tài),比如有的只有開、關(或者說電平高、低2種狀態(tài)),有的有3種狀態(tài),甚至有的還有更多狀態(tài)值,如何有效的在資源有限情況下存儲這M組IO的狀態(tài)信息,這時一般就會用到二進制及位運算了。
比如 第一個IO只有2種狀態(tài),則只需要一個二進制位就可以對應保存信息,
第二個IO有3種信息,則至少要2位(最多可以保存4種狀態(tài))
第M個IO口有n種信息,則需要有N位,其中2^(N-1)
這樣就需要1+2+....+N位 的二進制數(shù)來保存相應信息。
我們可以規(guī)定IO口對應二進制數(shù)順序是從低位到高位,即第一個IO對應的放置在低位,則對應狀態(tài)數(shù)據(jù)的產(chǎn)生算法為:
REC(n)= REC(n-1) | I(n) << L(n-1)
其中REC(n)表示1~n個IO口整個的狀態(tài)數(shù)據(jù)
I(n)是第n個IO口的狀態(tài)數(shù)據(jù)
L(n-1)是前面n-1個IO口數(shù)據(jù)一共需要的數(shù)據(jù)位數(shù),即前面的1+2+....+N
而I(n)的檢出算法則是:
I(n)= (REC(n)>>L(n-1)) & K(n)
其中K(n)是I(n)對應有效二進制位數(shù)各位置1的值,比如I(n)對應1位有效,則K(n)=1,如果I(n)對應2為有效,則K(n)=0x3 ,即I(n)有j位有效值,則為2^j-1
注意:
1. | 是按位或運算,&是按位與運算
2. 對于I(n)的檢出還需要要根據(jù)I(n)實際的取值范圍進行過濾,濾除不符合的情況。
比如有一個用到3個IO的采集狀態(tài)程序,第一個IO對應一個開關有2種狀態(tài),所以占1bit
第二個IO是采集步進電機狀態(tài),有停止、90度、180度、270度這樣4個狀態(tài),則需要2bit
地三個IO是采集溫度范圍的,有0-100度,每10度對應一個值,有10個值(0,1,...9),則需要4bit
這樣最后表示狀態(tài)的數(shù)據(jù)是一個7bit的二進制數(shù)K,要檢出各個IO對應值:
第一個IO: I(0)=K|0x1
第二個IO: I(1)=(K>>1)|0x3
第三個IO: I(2)=(K>>3)|0xF (因為是存儲數(shù)據(jù)再檢出,所以不需要過濾) ,如果是程序產(chǎn)生的,則還需要過濾,就是判斷I(2)<10。
評論