位运算分类
位运算符分类 | 格式 | 作用 |
---|---|---|
按位异或 | ^ | 两位相同时返回0,不同返回1 |
按位与 | & | 两位同时为1时返回1 |
按位或 | | | 两位只要有一位为1,返回1 |
按位非 | ~ | 将操作数的二进制的补码的每个位包括符号位全部取反(单目运算符) |
左移运算符 | << | 将操作数的二进制补码左移指定位数,右边空出以0填充 |
右移运算符 | >> | 将操作数的二进制补码右移指定位数,左边空出以符号位填充(正数是0,负数是1) |
无符号右移运算符 | >>> | 将操作数的二进制补码右移指定位数,左边空出都以0填充(结果都为正数) |
Tips: 1、位是说参与运算的操作数的二进制的补码
2、源码是整数转换为二进制,反码是将源码的每位取反(符号位不变),补码是在反码的基础上加1(符 号位不变)。
3、正数的源码,反码,补码都一样
具体运算
^按位异或
3^5
3的补码为:00000011
5的补码为:00000101
结果为: 00000110
转换为十进制是:6
&按位与
3&5
3的补码为:00000011
5的补码为:00000101
结果为: 00000001
转换为十进制是:1
|按位或
3|5
3的补码为:00000011
5的补码为:00000101
结果为: 00000111
转换为十进制是:7
~按位非
~-3
-3的源码:10000011
-3的反码:11111100
-3的补码:11111101
取反: 00000010
转换为十进制为2
左移运算符<<
-3<<2
-3的源码:10000011
-3的反码:11111100
-3的补码:11111101
将-3的补码左移2位,前面位数不要,后面空出位数0填充
11110100
将补码转换为源码
补码->反码:补码-1
11110011
反码->源码:取反
10001100
转换为十进制:-12
右移运算符>>
-3>>2
-3的源码:10000011
-3的反码:11111100
-3的补码:11111101
将-3的补码右移2位,后面位数不要,前面空出位数1填充
11111111
将补码转换为源码
补码->反码:补码-1
11111110
反码->源码:取反
10000001
转换为十进制:-1
无符号右移运算符>>>
-3>>>2
-3的源码:10000011
-3的反码:11111100
-3的补码:11111101
将-3的补码右移2位,后面位数不要,前面空出位数0填充
00111111
将补码转换为源码
补码->反码:补码-1
00111110
反码->源码:取反
01000001
转换为十进制:65
注意事项
1、 对于低于int类型的操作数总是先自动类型转换为int类型后再移位
2、 对于int类型的整数移位时,如果所移位数大于32,则系统会对32取余,得到的结果才是真正移位的位数,因为int类型只有32位。同理long类型时,所移位数大于64时,进行同样操作。