个人认为,位运算符是Java运算符中比较容易遗忘的运算符。位运算符多用于对数据进行底层操作,Java的位运算符有7种,下面将其一一列出以便必要时查找。
按位与(&)(双目双目运算符)
对两个操作数的补码逐位进行对比,若两操作数的补码同一位都为1,则所得结果的补码对应的位为1,否则为0.,将补码化成原码即可得到结果
例: -5 & 3 = 3
十进制 | 原码 | 反码 | 补码 |
-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
3 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 |
-5 & 3=3 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 |
按位或(|) (双目运算符)
对两个操作数的补码逐位进行对比,若某一位中有一个或以上操作数的补码为1,则所得结果的补码对应的位为0,若两操作数的补码同一位都为1,则所得结果的补码对应的位为0,将所得补码化成原码即可的到结果。
例: -5 | 3= -5 十进制 | 原码 | 反码 | 补码 |
-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
3 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 |
-5 | 3=-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
按位异或(^)(双目运算符) 用这个运算符是不能进行指数运算的
对两个操作数的补码逐位进行对比,若某一位中两个操作数的补码不一致时(一个为1,一个为0),则所得结果的补码对应的位为1,否则为0,将所得补码化成原码即可得到运算结果。
例: -5 ^ 3=-8
十进制 | 原码 | 反码 | 补码 |
-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
3 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 | 0000 0000 0000 0000 0000 0000 0000 0011 |
-5 ^ 3=-8 | 1000 0000 0000 0000 0000 0000 0000 1000 | 1111 1111 1111 1111 1111 1111 1111 0111 | 1111 1111 1111 1111 1111 1111 1111 1000 |
按位取反(~)(单目运算符)
对操作数的补码进行运算,对操作符的补码的每一位取反(1变成0, 0变成1),将所得补码化成原码即可的到取反结果。
例:……-5 = 4
十进制 | 原码 | 反码 | 补码 |
-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
^-5 = 4 | 0000 0000 0000 0000 0000 0000 0000 0100 | 0000 0000 0000 0000 0000 0000 0000 0100 | 0000 0000 0000 0000 0000 0000 0000 0100 |
按位左移(<<) (双目运算符)
将左操作数的补码向左移动右操作数个位(例如,若右操作数位2,则将左操作数的补码左移两位),,然后右边空出的若干位用0补上,再将左边超出去的若干位摄取,即可得到计算结果的补码,将所得补码化成原码即可得到运算结果
例: -5 << 3 = -40
十进制 | 原码 | 反码 | 补码 |
-5 | 1000 0000 0000 0000 0000 0000 0000 0101 | 1111 1111 1111 1111 1111 1111 1111 1010 | 1111 1111 1111 1111 1111 1111 1111 1011 |
-5<<3 = -40 | 1000 0000 0000 0000 0000 0000 0010 1000 | 1111 1111 1111 1111 1111 1111 1101 0111 | 111 1111 1111 1111 1111 1111 1111 1101 1000 |
按位右移 (>>)(双目运算符)
计算原理与按位左移相似,按位右移运算符对左操作数的补码进行右移,左边空出的位用符号为的数字补充,右边超出去的位则摄取。
无符号右移(>>>)(双目运算符)
无符号右移运算符计算方式与按位右移相似,不同的是,无符号右移运算符将补码右移后,左边空出的位都用0来补充。
另外,& | ~这三个运算符还可以对布尔值进行运算
operator | true op true | true op false | False op false |
& | true | false | false |
| | true | true | false |
^ | false | true | false |
& 、| 与逻辑运算符&&,|| 的运算结果一样但运算规则不一样:前者对两个布尔型的操作数都会进行判断,例如ture | true,系统判断完左操作数之后会再判断右操作数然后才会返回结果,而true|| true则是系统判断第一个操作数为true时就会直接返回true。
^对布尔值的运算:当左右两个布尔值不一致(相异)时返回true,否则返回false。