前言
- 查看
Java
源码可以发现很多地方使用了位运算符,所以整理下
整理
1、&(按位与)
‘ & ’ 符号的作用是对运算符的两侧以二进制表达的操作符按位进行‘与’运算。
只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为0,结果就为0)。
我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为只有都为‘true’的时候才为‘true’,否则就是‘false’。
举例
1 | 5 & 10 = ? |
2、|(按位或)
‘ | ’ 符号的作用是对运算符两侧以二进制表达的操作符按位分别进行’或’运算。
只有两个操作数对应位同为1时,结果为1,其余全为0. (或者是只要有一个操作数为1,结果就为1)。
我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为只要有一个为‘true’的时候就为‘true’,否则就是‘false’。
举例
1 | 5 | 10 = ? |
3、^(按位异或)
‘ ^ ’ 符号的作用是对运算符两侧以二进制表达的操作数按位分别进行’异或’运算。
我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为值不相等的时候为‘true’,值相等的时候为‘false’。
1 | 5 ^ 10 = ? |
4、~(按位非)
‘ ~ ’ 符号的作用是将各位数组取反。全部的0变为1,1变为0。
我们可以认为‘1’代表‘true’,‘0’代表‘false’。那么就可以理解为将‘true’变成‘false’,而‘false’变为‘true’。
1 | ~ 10 = ? |
1 | 很多人对负数的二进制的转换很迷惑,在这里为大家讲解下: |
5、<<(左位移运算符)
‘ << ’ 符号的作用是将一个运算对象的各二进制位全部左移若干位。
左边的二进制位丢弃,右边补0,左移可以看成是乘以2的多少次方。3 << 3就代表3乘以2的3次方。
1 | 10 << 3 = ? |
6、>>(右位移运算符)
‘ >> ’ 符号的作用是将一个运算对象的各二进制位全部右移若干位。
正数左补0,负数左补1,右边丢弃。
正数右移可以看成是跟2的多少次方取模,10 >> 3就代表10跟8取模得1。而负数则需要对应的转换,因为负数进行了补码的操作,所以跟正数的逻辑不同
1 | 10 >> 3 = ? |
7、>>>(无符号右位移运算符)
‘ >>> ’ 符号的作用是将一个运算对象的各二进制位全部右移若干位。
右移后左边空出的位用零来填充。移出右边的位被丢弃。无符号的意思是将符号位当作数字位看待。
正数的无符号右移可以看成是跟2的多少次方取模,10 >>> 3就代表10跟8取模得1。而负数的无符号右移是不同的,就不需要再进行转换的操作,-1 >>> 1 = 2147483647
1 | 10 >>> 3 = ? |
补充
&和&&:
共同点:两者都可做逻辑运算符。它们都表示运算符的两边都是 true 时,结果为 true;
不同点: &也是位运算符。& 表示在运算时
两边都会计算
,然后再判断;&&表示先运算符号左边的东西,然后判断是否为 true,是 true 就继续运算右边的然后判断并输出,是 false 就停下来直接输出不会再运行后面的东西。
总结
Java
位运算是针对于整型(byte、char、short、int、long)
数据类型的二进制进行的移位操作。- 我为什么要它?位运算的运算效率比直接对数字进行加减乘除高很多,代码需要考虑性能的时候