位运算小结(按位与、按位或、按位异或、取反、左移、右移)
位运算不管是在Java语言,还是在C语言中,或者其他语言,都是经常会用到的,所以本文也就不固定以某种语言来举例子了,原始点就从0、1开始。位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)这几种,其中除了取反(~)以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。
1、补码
在总结按位运算前,有必要先介绍下补码的知识,我们知道当将一个十进制正整数转换为二进制数的时候,只需要通过除2取余的方法即可,但是怎么将一个十进制的负整数转换为二进制数呢?其实,负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。
要将十进制的-10用二进制表示,先将10用二进制表示: 0000 0000 0000 1010 取反: 1111 1111 1111 0101 加1: 1111 1111 1111 0110 所以,-10的二进制表示就是:1111 1111 1111 0110
2、按位与(&)
参加运算的两个数,换算为二进制(0、1)后,进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
将10与-10进行按位与(&)运算: 0000 0000 0000 1010 1111 1111 1111 0110 ----------------------- 0000 0000 0000 0010 所以:10 & -10 = 0000 0000 0000 0010
3、按位或(|)
参加运算的两个数,换算为二进制(0、1)后,进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
将10与-10进行按位或(|)运算: 0000 0000 0000 1010 1111 1111 1111 0110 ----------------------- 1111 1111 1111 1110 所以:10 | -10 = 1111 1111 1111 1110
4、按位异或(^)
参加运算的两个数,换算为二进制(0、1)后,进行异或运算。只有当相应位上的数字不相同时,该为才取1,若相同,即为0。
将10与-10进行按位异或(^)运算: 0000 0000 0000 1010 1111 1111 1111 0110 ----------------------- 1111 1111 1111 1100 所以:10 ^ -10 = 1111 1111 1111 1100
可以看出,任何数与0异或,结果都是其本身。利用异或还可以实现一个很好的交换算法,用于交换两个数,算法如下:
a = a ^ b; b = b ^ a; a = a ^ b;
5、取反(~)
参加运算的两个数,换算为二进制(0、1)后,进行取反运算。每个位上都取相反值,1变成0,0变成1。
对10进行取反(~)运算: 0000 0000 0000 1010 --------------------- 1111 1111 1111 0101 所以:~10 = 1111 1111 1111 0101
6、左移(<<)
参加运算的两个数,换算为二进制(0、1)后,进行左移运算,用来将一个数各二进制位全部向左移动若干位。
对10左移2位(就相当于在右边加2个0): 0000 0000 0000 1010 -------------------- 0000 0000 0010 1000 所以:10 << 2 = 0000 0000 0010 1000 = 40
注意,观察可以发现,左移一位的结果就是原值乘2,左移两位的结果就是原值乘4。
7、右移(>>)
参加运算的两个数,换算为二进制(0、1)后,进行右移运算,用来将一个数各二进制位全部向右移动若干位。
对10右移2位(就相当于在左边加2个0): 0000 0000 0000 1010 -------------------- 0000 0000 0000 0010 所以:10 >> 2 = 0000 0000 0000 0010 = 2
注意,观察可以发现,右移一位的结果就是原值除2,左移两位的结果就是原值除4,注意哦,除了以后没有小数位的,都是取整。
建议继续学习:
- 神秘常量复出!用0x077CB531计算末尾0的个数 (阅读:5230)
- 在JavaScript中什么时候使用==是正确的? (阅读:3842)
- 神奇的两次按位非运算符 (阅读:3058)
- JavaScript运算符 (阅读:2448)
- PHP运算符优先级的一个例外 (阅读:2198)
- javascript运算符 (阅读:1261)
- 位运算技巧整理 (阅读:1138)
- [Java基础教程]第六章-Java数学运算符 (阅读:939)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:叶德华的博客 来源: 叶德华的博客
- 标签: 位运算 运算符
- 发布时间:2015-01-23 23:56:07
- [56] Oracle MTS模式下 进程地址与会话信
- [56] IOS安全–浅谈关于IOS加固的几种方法
- [55] 如何拿下简短的域名
- [54] 图书馆的世界纪录
- [52] android 开发入门
- [52] Go Reflect 性能
- [50] 读书笔记-壹百度:百度十年千倍的29条法则
- [49] 【社会化设计】自我(self)部分――欢迎区
- [38] 程序员技术练级攻略
- [33] 视觉调整-设计师 vs. 逻辑