程序中的所有數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操作。比如,and運算本來是一個邏輯運算符,但整數與整數之間也可以進行and運算。舉個例子,6的二進制是110,11的二進制是1011,那麼6 and 11的結果就是2,它是二進制對應位進行邏輯運算的結果(0表示False,1表示True,空位都當0處理) 。簡介
110
AND 1011
---------------
0010 --> 2
有人會說,計算6 and 11沒有什麼實際意義啊。這一系列的文章就將告訴你,位運算到底可以乾什麼,有些什麼經典應用,以及如何用位運算優化你的程序。
運算符號
下面的a和b都是整數類型,則:
Pascal語言| C語言 | Java
------- ------------- ---------
a and b | a&b | a&b
a or b | a|b | a|b
a xor b | a ^ b | a ^b
not a | ~a | ~a
a shl b | a << b | a << b
a shr b | a >> b | a>>b 無符號右移
- | - | a>>> b 帶符號右移
注意C中的邏輯運算和位運算符號是不同的。 520|1314=1834,但520||1314=1,因為邏輯運算時520和1314都相當於True。同樣的,! a和~a也是有區別的。
運算說明
=== 1. and運算 ===
and運算通常用於二進制取位操作,例如一個數and 1的結果就是取二進制的最末位。這可以用來判斷一個整數的奇偶,二進制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。
相同位的兩個數字都為1,則為1;若有一個不為1,則為0。
00111
11100
(&;或者and)
----------------
00100
=== 2. or運算 ===
or運算通常用於二進制特定位上的無條件賦值,例如一個數or 1的結果就是把二進制最末位強行變成1。如果需要把二進制最末位變成0,對這個數or 1之後再減一就可以了,其實際意義就是把這個數強行變成最接近的偶數。
|