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







           
            
            
                
            
評(píng)論