位运算中特别有用的功能

来源:互联网 发布:js计算购物车总金额 编辑:程序博客网 时间:2024/05/18 08:20

     ### Date: 2017/3/17 

     ### Author: SoaringLee

    

     最近在学习和调试一个工程项目时,发现很多操作都是通过位运算或者逗号表达式进行实现的。一方面是因为位运算的效率是很高的运算是非常迅速的,因为它直接对内存中的二进制数据进行操作。 另一方面,可以对代码进行优化,提高效率的的同时,也可以简化代码。


      按位运算除了,按位与,按位非,按位左移,按位右移,还有按位异或。


按位异或运算定义,

1 ^ 1=0

1 ^ 0=1

0 ^ 1=1

0 ^ 0=0

异或,就是“相同为0,不同为1”

 

  • 按位异或运算的规律

定理一a ^ b = b ^ a

定理二 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

定理三 a ^ b ^ a = b, a ^ a^ b = b, b ^ a^ a = b

定理四若d = a ^ b ^ c,则a = d ^ b ^ c

证明:

在d = a ^ b ^ c两边同时异或^ b ^ c,得

d ^ b ^ c =a ^ b ^ c ^ b ^ c

d ^ b ^ c =a ^ b ^ b ^ c ^ c,由定理三得

d ^ b ^ c =a ^ c ^ c,同样由定理三得

d ^ b ^ c =a

 

 

  • 异或的几个常见用途:

(1) 实现两个值的交换,而不必使用临时变量。

    例如交换两个整数a=10100001,b=00000110的值,可通过下列语句实现:

    a = a^b;  //a=10100111

    b = b^a;  //b=10100001

    a = a^b;  //a=00000110

 

(2) 在汇编语言中经常用于将变量置零:

   xor   a,a

 

(3) 使某些特定的位翻转

    例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。

       10100001^00000110 = 10100111

 

(4)使用定理三进行编码解码

由B ^ A^ A = B,我们可以假设一聊天记录是B,密钥是A。现在B ^ A之后,成了密文了。为了解密,对密文再使用密钥A进行一次异或运算即可。也即是B ^ A^ A = B。


另外,最近经常用到一个混合位运算,感觉特别有用:


&~:这个混合位运算可以实现取出最高位和比较的作用。

比如:m&~(m-1):就是取出m的最高位;

           if(p&~63) 就等价于if(p>63)。

m&1:可以用来判断m是奇数还是偶数。if(m&1) 表示如果m是奇数;if(m&1==0)表示如果m是偶数。


好了,今天就总结这么多了,后续用到比较好的位运算继续总结在下面,

未完待续。。。。。。



0 0