Java位运算(移位、与、或、异或、非)
条评论Java的位运算符:左移(<<)、右移(>>)、无符号右移(>>>)、与(&)、异或(|)、非(~)
除了 非(~) 是一元操作符外,其他都是二元操作符。
运算符 | 运算 | 说明 |
---|---|---|
<< | 左移 | 空位补0,被移除的高位丢失 |
>> | 右移 | 被移位的二进制最高位是0,右移后,空缺位补0,最高位是1,最高位补1 |
>>> | 无符号右移 | 被移位的二进制无论是0或者是1,空缺位都是用0补 |
& | 与运算 | 任何二进制位和0进行&运算,结果都是0,和1进行&运算,都是原值 |
l | 或运算 | 任何二进制位和0进行或运算,结果都是原值,和1进行或运算,都是1 |
^ | 异或运算 | 任何相同二进制位进行异或运算,结果都是0,不同二进制位进行异或运算,结果都是1 |
~ | 非运算 | 反转操作数的二进制位,即0变成1,1变成0 |
左移(<<)
示例1: 将5左移2位
1
2
3
4
5
6
7package io.github.code;
public class Test {
public static void main(String[] args) {
System.out.println(5 << 2);//运行结果是20
}
}java
中,整数默认就是int
类型32位,首先将5转为二进制表示:1
2
30000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0
0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20右移(>>)
示例2: 将5右移2位
1
System.out.println(5>>2);//运行结果是1
还是先将5转为二进制表示:
1
2
30000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0
0000 0000 0000 0000 0000 0000 0000 0001 换算成10进制为1无符号右移(>>>)
示例3: 分别将5右移3位、将-5右移3位、将-5无符号右移3位
1
2
3System.out.println(5>>3);//结果是0
System.out.println(-5>>3);//结果是-1
System.out.println(-5>>>3);//结果是536870911还是来看看位移过程:
1
2
3
4
5
65换算成二进制: 0000 0000 0000 0000 0000 0000 0000 0101
5右移3位后结果为0,0的二进制为: 0000 0000 0000 0000 0000 0000 0000 0000
-5换算成二进制: 1111 1111 1111 1111 1111 1111 1111 1011
-5右移3位后结果为-1,-1的二进制为: 1111 1111 1111 1111 1111 1111 1111 1111
-5无符号右移3位后的结果 536870911 换算成二进制: 0001 1111 1111 1111 1111 1111 1111 1111
正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)
与(&)
示例4: 5&3 进行与运算
1
System.out.println(5 & 3);//结果为1
转换为二进制比较:
1
2
3
45转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
1转换为二进制:0000 0000 0000 0000 0000 0000 0000 0001与(&)第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
或(|)
示例5: 5|3 进行或运算
1
System.out.println(5 | 3);//结果为7
转换为二进制比较:
1
2
3
45转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
7转换为二进制:0000 0000 0000 0000 0000 0000 0000 0111或(|)第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
异或(^)
示例6: 5^3 进行异或运算
1
System.out.println(5 ^ 3);//结果为6
转换为二进制比较:
1
2
3
45转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
6转换为二进制:0000 0000 0000 0000 0000 0000 0000 0110异或(^)第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
非(~)
示例7: ~5 进行非运算
1
System.out.println(~5);//结果为-6
转换为二进制比较:
1
25转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
-6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010非:操作数的第n位为1,那么结果的第n位为0,反之。
位运算操作符衍生而来的有:
&= 按位与赋值
|= 按位或赋值
^= 按位非赋值
>>= 右移赋值
= 无符号右移赋值
<<= 赋值左移
和 += 一个概念。
示例:
1 | int a = 5 |
Reference
本文标题:Java位运算(移位、与、或、异或、非)
文章作者:xmaihh
发布时间:2019-11-05
最后更新:2019-11-05
原始链接:https://xmaihh.github.io/blog/2019/11/05/java-wei-yun-suan-yi-wei-yu-huo-yi-huo-fei/
版权声明:采用[CC BY-NC-SA 4.0许可协议]进行许可
分享