注意:要做位运算,首先要把数据转换为二进制
1、&,|,^, ~:
class OperatorDemo {
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(3 & 4); //0
System.out.println(3 | 4); //7
System.out.println(3 ^ 4); //7
System.out.println(~3); //-4
}
}
3的二进制:11
00000000 00000000 00000000 00000011
4的二进制:100
00000000 00000000 00000000 00000100
(1)&
&位与运算:有0则0。
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000000
结果是:0
(2)|
|位或运算:有1则1。
00000000 00000000 00000000 00000011
|00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
(3)^
^位异或运算:相同则0,不同则1。
00000000 00000000 00000000 00000011
&00000000 00000000 00000000 00000100
-----------------------------------
00000000 00000000 00000000 00000111
结果是:7
*^异或运算特殊:如果一个数被另一个数异或两次则仍为该数
(4)~
~按位取反运算符:0变1,1变0
00000000 00000000 00000000 00000011
~11111111 11111111 11111111 11111100 (补码)
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是:-4(因为参与计算的都是补码,所以应将得到的补码计算出原码显示)
*前面的也没有做这个转换是因为正数的原、反补码都相同
2、位移运算符
class OperatorDemo{
public static void main(String[] args) {
//快速计算:<< 把<<左边的数据乘以2的移动次幂
System.out.println(3 << 2); //3*2^2 = 3*4 = 12;
//>> 快速计算:把>>左边的数据除以2的移动次幂
System.out.println(24 >> 2); //24 / 2^2 = 24 / 4 = 6
System.out.println(24 >>> 2);
System.out.println(-24 >> 2);
System.out.println(-24 >>> 2);
}
}
(1) <<:左移 左边最高位丢弃,右边补齐0
示例:3 << 2
计算出3的二进制:11
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100 = 12
(2)>>:右移 最高位是0,左边补齐0;最高为是1,左边补齐1
示例:-24 >> 2
计算出24的二进制:11000
-24
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
右移两位
1111111111 11111111 11111111 111010(00) 补码
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
(3) >>>:无符号右移 无论最高位是0还是1,左边补齐0
-24的补码: 11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
结果:1073741818(数字太大,可自己用计算机得出)