位運算算是從彙編語言一代傳下來的老東西了,只有寥寥6個運算符。乍一看,你會說它沒什麼用處,那麼你只對了一半:站在如今的高級編程角度來說,確實用處不大;可是在涉及硬件底層的編程(如驅動程序,嵌入式開發)裏,須要很強的操縱硬件能力,這時,就經常涉及到位運算。ios
位運算有6個運算符,它們分別是:&(與)、|(或)、^(異或)、~(取反)、>>(右移)、<<(左移)。其含義以下表所示:編程
運算符 | 含義 |
& | 按位與 |
| | 按位或 |
^ | 按位異或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |
筆者也是由於單片機才接觸位運算的。可是總不能把Atmega128點亮LED的例程做爲例子講解。接下來,以幾個實用的例子助你登入位運算的大門:spa
例1.判斷一個數的奇偶性:經常會遇到判斷一個數奇偶的狀況,這時候,經常使用的方法是模2取餘。這種方法的效率略慢(雖然只是常數),能夠用位運算取代。方法是將這個數與1進行與運算。這樣,若是結果是1,即爲奇數,不然就是偶數。原理:與1進行與運算即取操做數的第1位,而第一位是1,則數爲奇數,不然數爲偶數。code
例2.交換兩個整數:若是這兩個整數是x和y,那麼最經常使用的方法就是使用臨時變量tmp,先將x賦值給tmp,再將y賦值給x,最後將tmp賦值給y。這樣的方法無疑須要更多內存。而下面的方法則不用那個討厭的臨時變量。blog
x ^= y; y ^= x; x ^= y;
神奇吧?原理?只要記住異或的反操做是本身。對一個操做數進行兩次相同的異或操做,最後會回到原來的值。內存
例3.看下面那段簡單的代碼:ci
if (x == a) x= b; else x=a;
這段代碼也可使用位運算來改變。讓它變得,額…更有逼格。它等價於:開發
x=a^b^x;
……其實位運算的例子不止這麼點,包括子網掩碼,iostream的狀態等也用到了這個運算。而它的執行速度是當然比其餘運算快的(畢竟計算機基於2進制)。因此,卡常量的朋友們,大家能夠試試--io