位运算中特别有用的功能
来源:互联网 发布: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是偶数。
好了,今天就总结这么多了,后续用到比较好的位运算继续总结在下面,
未完待续。。。。。。
- 位运算中特别有用的功能
- 有用的位运算
- 有用的位运算
- Shell 中位运算符的应用(特别举例按位非)
- Shell 中位运算符的应用(特别举例按位非)
- 非常有用的位运算技巧
- 用位运算实现 | 与 ^ 的功能
- 九个PHP中很有用的功能
- 九个PHP中很有用的功能
- 九个PHP中很有用的功能
- 18 个特别有用的 Photoshop 快捷键
- 178,特别有用的调试技巧
- 关于JAVA中位运算的学习
- Java中boolean类型的位运算
- Android中巧妙的位运算
- php中位运算的学习
- 关于java中位运算的研究
- Android中巧妙的位运算
- 多线程_生产者消费者问题描述图
- Ngrok穿透工具的使用
- POJ 2976 Dropping tests
- 111. Minimum Depth of Binary Tree
- MVP模式在Android项目中的使用
- 位运算中特别有用的功能
- Android软件测试的日志文件抓取简介
- web如何伪装自己的IP地址
- Ubuntu 14.04 安装TendaW311M USB无线网卡驱动
- Set DISPLAY environment variable, then re-run.
- Dubbo学习笔记(三) Provider和Consumer
- POJ 2029 Get Many Persimmon Trees (枚举)
- 多线程等待唤醒机制之生产消费者模式
- WebP图片在业务中的实际应用