位元運算

本页使用了标题或全文手工转换,现处于繁体转换模式
出自求聞百科

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

位運算符

取反(NOT)

取反是一元運算符,對一個二進制數的每一位執行邏輯操作。使數字1成為0,0成為1。例如:

NOT 0111(十進位7)
  = 1000(十進位8)

許多程序設計語言(包括C語言家族),取反操作符用波浪線"~"表示。值得注意的是此操作符與「邏輯非(!)」操作符不同。在C++中,邏輯非將數字整體看做一個布爾類型——將真值轉化為假,將假值轉化為真;而C語言將0轉化為1,將非零值轉化為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語言中,左移使用兩個小於符號"<<"表示,右移使用兩個大於符號">>"表示。

算術移位

Left arithmetic shift
150px arithmetic shift

邏輯移位

應用邏輯移位時,移位後空缺的部分全部填0。

   0001(十進制1)
<<    3(左移3位)
 = 1000(十進制8)
   1010(十進制10)
>>    2(右移2位)
 = 0010(十進制2)

Java中的移位

JAVA中有一個特有的無符號右移操作符「>>>」。此操作將忽略操作數的符號,同樣的還有「>>>=」。