个人认为,位运算符是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。
本文详细介绍了Java中的7种位运算符,包括按位与、按位或、按位异或、按位取反、按位左移、按位右移及无符号右移,并通过实例说明了它们的具体应用。
1063

被折叠的 条评论
为什么被折叠?



