所謂的位運算指的是二進位制位的運算。在系統軟體中,常要處理二進位制位的問題。例如,將乙個儲存單元中的二進位制位左移或右移以為,兩個數按位相加等等。
c語言中提供了如表1所列出的位運算子。
表 1運算子 含義
運算子 含義
&按位與 ~
取反 |
按位或<< 左移
^按位異或
>> 右移
說明:
1、位運算中除~以外,均為二目運算子,即要求兩側各有乙個運算量。
2、運算量只能是整型或字元型的資料,不能為實型資料。
下面對各個運算子做簡單的介紹。
參加運算的兩個資料,按二進位制位進行「與」運算。運算規則為:如果兩個相應的位上的二進位制為都為1,則該位的運算結果也為1,否則為0。即如下的表示式:
0&0=0 0&1=0 1&0=0 1&1=1
如果參加位運算的運算元為負數,則以補碼的形式表示二進位制數,然後按位進行與運算。
按位與運算有一些特殊的用途如下:
1、清零。
如果想將乙個單元清零,即使其全部二進位制位為0,只要找乙個二進位制數,其中各個位符合下面的條件:原來數中為1的位置,新數中相應的位為0,然後使二者進行與運算,既可以達到清零的母的。
2、取乙個數中某些指定的位。只要將要取的某些位與1相與,就可以得到想要取得位的值。
3、將某一位留下來。要想將某一位留下來,就與乙個數進行與運算,次數在該位取1。這一點在嵌入式開發中應用的比較廣泛。例如,在點亮乙個led燈的時候,通過控制與之相連的處理器的io口,取1或者取0 就可以控制led燈的亮和滅。
兩個相應的二進位制位中只要有一位為1,該位相或之後的結果就為1。規則如下:
0|0=0 0|1=1 1|0=1 1|1=1
或運算主要是用將乙個資料的某些位置1。
異或運算子^也成為xor運算子。它的規則是:若參加運算的兩個二進位制位同號,則結果為0,異號則為1。即 0^0=0,0^1=1,1^0=1,1^1=0。異或的意思就是判斷兩個相應的位值是否為「異」,為「異」就為真,否則為假。
我印象中異或運算的乙個比較有意思的應用是交換兩個值,不使用中間變數。
假設a=3,b=4,想交換a和b的值,可以用下面的賦值語:
a=a^b;
b=b^a;
a=a^b;
上面的三個賦值語句就可以實現交換兩個數的值。
說明:1、執行前兩個賦值語句:「a=a^b和b=b^a」相當於b=b^(a^b)。而b^a^b等於a^b^b。 b^b的結果為0,因為同乙個數與本身相異或,結果必為0。因此,b的值就等於a^0, 其值為3。
2、再執行第三個賦值語句:a=a^b。由於a的值的等於(a^b),b的值等於(b^a^b), 因此,相當於a=a^b^b^a^b,即a的值等於b的值,即4。
注: 回顧我們所學過的,實現交換兩個數的值的方法有4種。
~是乙個單目運算子,用來對乙個二進位制數按位取反,即將0變為1,將1變0。取反運算子的優先順序比算術運算子,關係運算子,邏輯運算子和其他位運算子都要高。
用來將乙個數的各二進位制位全部左移若干位。高位左移溢位後就捨棄。左移1 位相當於該數乘以2,左移兩位就相當於乘以2的平方,依次類推,左移多少位就相當於該數乘以2的多少次方,但是此結論只適用於該數左移時被溢位捨棄的高位中不含1的情況。
用於將乙個數的各二進位制位全部右移若干位,移到右端的低位被捨棄,對去符號數,高位補0.右移以為相當於除以2,右移n位相當於除以2的n次方。在右移的過程中,需要注意符號位的問題。對於無符號數,右移時左邊高位補0,對於有符號的值,如果原來符號位為0,則左邊也是一如0;如果符號位為1,,則左邊移入的是1還是0,要取決於所用的計算機系統。移入0的稱為「邏輯右移」,移入1的稱為「算術右移」。
位段以位為單位定義的結構體中成員所占用儲存空間的長度,含有位段的結構體型別稱為位段結構。位段結構也是一種結構體型別,只不過其中含有以位為單位定義儲存長度的整數型別位段成員。採用位段結構既節省儲存空間,又可方便操作。
位段結構中位段的定義格式為: unsigned 《成員名》 : 《二進位制位數》 例:
struct bytedata
data;
位段資料的引用:同結構體成員的資料引用一樣,但是應該注意位段的最大值範圍不要超過二進位制位數定的範圍,否則超出部分會丟棄。例如:data.a=2;但是data.a=10;就超出了範圍。
關於位段資料,注意以下幾點:
(1)乙個位段必須儲存在同一儲存單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩餘空間不用,從下乙個單元起存放該位段。
(2)可以通過定義長度為0的位段的方式使下一位段從下一儲存單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大於儲存單元的長度。
(5)位段無位址,不能對位段進行取位址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表示式中,將被系統自動轉換成整數。
結構體大小原則:由於儲存變數時位址對齊的要求,編譯器在編譯程式時會遵循兩條原則:第
一、結構體變數中成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)。第
二、結構體大小必須是所有成員大小的整數倍。
linux運算 linux運算子
bin bash a 10 b 20 val expr a b echo a b val val expr a b echo a b val val expr a b echo a b val val expr b a echo b a val val expr b a echo b a val i...
在嵌入式linux環境下,搭建ROS下位機
最近在ros官網上發現rosserial支援embeddlinux,於是對這個產生了很大的興趣,傳統大家都是用arduino來做下位機,通過串列埠的形式來做控制的,但是有時候我們的下位機可能需要很大的計算量,這時候用普通的微控制器可能性能就不是很夠的了,因此我做這樣乙個教程,通過給樹莓派編譯ross...
位運算總結
位運算是指按二進位制進行的運算。在系統軟體中,常常需要處理二進位制位的問題。c語言提供了6個位操作 運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。c語言提供的位運算子列表 運算子 含義 描述 按位與 如果兩個相應的二進位制位都為1,則該位...