linux下位運算總結

2021-06-02 00:39:38 字數 2517 閱讀 8340

所謂的位運算指的是二進位制位的運算。在系統軟體中,常要處理二進位制位的問題。例如,將乙個儲存單元中的二進位制位左移或右移以為,兩個數按位相加等等。

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,則該位...