
110
AND 1011
---------------
0010 --> 2
有人會說,計算6 and 11沒有什麼實際意義啊。這一系列的文章就将告訴你,位運算到底可以幹什麼,有些什麼經典應用,以及如何用位運算優化你的程式。
下面的a和b都是整數類型,則:
含義
<a href="http://baike.baidu.com/view/765708.htm" target="_blank">Pascal語言</a>
C語言
Java
按位與
a and b
a & b
<a href="http://baike.baidu.com/view/1438891.htm" target="_blank">按位或</a>
a or b
a | b
a xor b
a ^ b
not a
~a
左移
a shl b
a << b
a shr b
a >> b
無符号右移
a>>> b
下面列舉了一些常見的二進制位的變換操作。
功能 | 示例 | 位運算
----------------------+---------------------------+--------------------
去掉最後一位 | (101101->10110) | x shr 1
在最後加一個0 | (101101->1011010) | x shl 1
在最後加一個1 | (101101->1011011) | x shl 1+1
把最後一位變成1 | (101100->101101) | x or 1
把最後一位變成0 | (101101->101100) | x or 1-1
最後一位取反 | (101101->101100) | x xor 1
把右數第k位變成1 | (101001->101101,k=3) | x or (1 shl (k-1))
把右數第k位變成0 | (101101->101001,k=3) | x and not (1 shl (k-1))
右數第k位取反 | (101001->101101,k=3) | x xor (1 shl (k-1))
取末三位 | (1101101->101) | x and 7
取末k位 | (1101101->1101,k=5) | x and(1 shl k-1)
取右數第k位 | (1101101->1,k=4) | x shr (k-1) and 1
把末k位變成1 | (101001->101111,k=4) | x or (1 shl k-1)
末k位取反 | (101001->100110,k=4) | x xor (1 shl k-1)
把右邊連續的1變成0 | (100101111->100100000) | x and (x+1)
把右起第一個0變成1 | (100101111->100111111) | x or (x+1)
把右邊連續的0變成1 | (11011000->11011111) | x or (x-1)
取右邊連續的1 | (100101111->1111) | (x xor (x+1)) shr 1
去掉右起第一個1的左邊 | (100101000->1000) | x and (x xor (x-1))(或 x and (-x))
Pascal和C中的16進制表示
Pascal中需要在16進制數前加$符号表示,C中需要在前面加0x來表示。這個以後我們會經常用到。
http://baike.baidu.com/link?url=CbtldLO3RjKXWiDBruOltlTj4_UI3bRfDxt0jKs4dkHLiQ4hA6bDZfqFqv4zsGAXf2H0gGNhs6yNOjQv4HIiPa#4