位操作

位操作是程式設計中對位模式按位或二進制數的一元和二元操作. 在許多古老的微處理器上, 位運算比加減運算略快, 通常位運算比乘除法運算要快很多. 在現代架構中, 情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算)。

基本介紹

  • 中文名:位操作
  • 簡述:一元和二元操作
  • 取反:NOT
  • 按位或:OR
位運算符,取反(NOT),按位或(OR),按位異或(XOR),按位與(AND),移位,算術移位,邏輯移位,C, C++ 和 Java中的移位,

位運算符

取反(NOT)

取反是一元運算符, 對一個二進制數的每一位執行邏輯反操作。使數字1成為0, 0成為1。例如:
NOT 0111(十進制 7) = 1000 (十進制 8)
許多程式設計語言(包括C程式設計語言family), 取反操作符用波浪線"~"表示。值得注意的是此操作符與"邏輯非(!)" 操作符不同. 在C++中,邏輯非將數字整體看做一個布爾類型-- 將真值轉化為假,將假值轉化為真;而C語言將值1轉化為0,將非零值轉化為0。"邏輯非"並不是一個位操作。

按位或(OR)

按位或處理兩個長度相同的二進制數,兩個相應的二進位中只要有一個為1,該位的結果值為1。例如
0101 (十進制 5) OR 0011 (十進制 3) = 0111 (十進制 7)
在C類程式設計語言中,按位或操作符是"|"。這一操作符需要與邏輯按位或運算符(||)區別開來。
按位或能夠將每一位看做旗幟;在二進制數中的每一位可以表示不同的布爾變數。套用按位或操作可以將二進制數的某一位設為1。例如
0010(十進制 2)
能夠看做包含4個旗幟的組合。第1,2,4旗幟為0;第3個旗幟為1。利用按位或可以將第1個旗幟設定為1,而其他旗幟不變。
0010 (十進制 2) OR 1000 (十進制 8) = 1010 (十進制 10)
這一技巧通常用來保存程式中的大量布爾變數。

按位異或(XOR)

按位異或運算,對等長二進制模式按位或二進制數的每一位執行邏輯異按位或操作,操作的結果是如果某位不同則該位為1,否則該位為0,例如
0101 XOR 0011 = 0110
在類C語言中, 按位異或運算符是 "^"。
彙編語言的程式設計師們有時使用按位異或運算作為將暫存器的值設為 0 的捷徑。用值的自身對其執行按位異或運算將得到 0。並且在許多架構中,與直接載入 0 值並將它保存到暫存器相比,按位異或運算需要較少的中央處理單元時鐘周期。
按位異或也可以用於在比特集合中切換旗幟。給出一個比特模式,
0010
第一和第三位能夠通過按位異或運算使用同時切換.
0010 XOR 1010 = 1000
這一技巧可用於操作表示布爾變數的比特模式。

按位與(AND)

按位與處理兩個長度相同的二進制數,兩個相應的二進位都為1,該位的結果值才為1,否則為0。例如:
0101 AND 0011 = 0001
在類C語言中,按位與用'&'表示。

移位

移位是一個二元運算符,用來將一個二進制數中的每一位全部都向一個方向移動指定位,溢出的部分將被捨棄,而空缺的部分填入一定的值。在類C語言中,左移使用兩個小於符號"<<"表示,右移使用兩個大於符號">>"表示。

算術移位

另見::en:Arithmetic shift和:en:Arithmetic shift

邏輯移位

套用邏輯移位時,移位後空缺的部分全部填0.
0001 (十進制 1) << 3 (左移 3 位) = 1000 (十進制 8) 1010 (十進制 10) >> 2 (右移 2 位) = 0010 (十進制 2)

C, C++ 和 Java中的移位

JAVA中有一個特有的無符號右移操作符“>>>”。此操作將忽略運算元的符號 同樣的還有>>>=

相關詞條

熱門詞條

聯絡我們