天天看点

位运算

位运算

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 &amp; 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 &lt;&lt; b

a shr b

a &gt;&gt; b

无符号右移

 

a&gt;&gt;&gt; b

下面列举了一些常见的二进制位的变换操作。

功能 | 示例 | 位运算

----------------------+---------------------------+--------------------

去掉最后一位 | (101101-&gt;10110) | x shr 1

在最后加一个0 | (101101-&gt;1011010) | x shl 1

在最后加一个1 | (101101-&gt;1011011) | x shl 1+1

把最后一位变成1 | (101100-&gt;101101) | x or 1

把最后一位变成0 | (101101-&gt;101100) | x or 1-1

最后一位取反 | (101101-&gt;101100) | x xor 1

把右数第k位变成1 | (101001-&gt;101101,k=3) | x or (1 shl (k-1))

把右数第k位变成0 | (101101-&gt;101001,k=3) | x and not (1 shl (k-1))

右数第k位取反 | (101001-&gt;101101,k=3) | x xor (1 shl (k-1))

取末三位 | (1101101-&gt;101) | x and 7

取末k位 | (1101101-&gt;1101,k=5) | x and(1 shl k-1)

取右数第k位 | (1101101-&gt;1,k=4) | x shr (k-1) and 1

把末k位变成1 | (101001-&gt;101111,k=4) | x or (1 shl k-1)

末k位取反 | (101001-&gt;100110,k=4) | x xor (1 shl k-1)

把右边连续的1变成0 | (100101111-&gt;100100000) | x and (x+1)

把右起第一个0变成1 | (100101111-&gt;100111111) | x or (x+1)

把右边连续的0变成1 | (11011000-&gt;11011111) | x or (x-1)

取右边连续的1 | (100101111-&gt;1111) | (x xor (x+1)) shr 1

去掉右起第一个1的左边 | (100101000-&gt;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