位操作是程序設計中對位模式或二進制數的一元和二元操作。在許多古老的微處理器上,位運算比加減運算略快,通常位運算比乘除法運算要快很多。在現代架構中,情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算)。
位運算符
取反(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語言中,左移使用兩個小於符號"<<"表示,右移使用兩個大於符號">>"表示。
算術移位
邏輯移位
應用邏輯移位時,移位後空缺的部分全部填0。
0001(十進制1) << 3(左移3位) = 1000(十進制8)
1010(十進制10) >> 2(右移2位) = 0010(十進制2)
Java中的移位
JAVA中有一個特有的無符號右移操作符「>>>」。此操作將忽略操作數的符號,同樣的還有「>>>=」。