与远算,或运算,异或运算,反码
public class OptPositionDemo1 {
public static void main(String[] args) {
int x = 3;
int y = 4;
System.out.println(x&y); //0
System.out.println(x|y); //7
System.out.println(x^y); //7
System.out.println(~x); //-4
}
}
分析:
要先得到二进制 计算机中数据参与运算的都是补码
3的二进制:11
4的二进制:100
3的原码、反码、补码:00000000 00000000 00000000 00000011
4的原码、反码、补码:00000000 00000000 00000000 00000100
&位与运算:有0则0
00000000 00000000 00000000 00000011
&
00000000 00000000 00000000 00000100
-----------------------------------------
00000000 00000000 00000000 00000000
结果是0
|位或运算:有1则1
00000000 00000000 00000000 00000011
|
00000000 00000000 00000000 00000100
------------------------------------------
00000000 00000000 00000000 00000111
结果是7
^位异或运算:相同则0,不同则1
00000000 00000000 00000000 00000011
^
00000000 00000000 00000000 00000100
------------------------------------------
00000000 00000000 00000000 00000111
结果是7
~位取反:0变成1,1变成0
00000000 00000000 00000000 00000011
--------------------------------------
~ 11111111 11111111 11111111 11111100
补码求原码:
符号位 数值位
补码: 1 1111111 11111111 11111111 11111100
反码: 1 1111111 11111111 11111111 11111011
原码: 1 0000000 00000000 00000000 00000100
结果是-4
左移,右移,无符号右移
public class OptPositionDemo2 {
public static void main(String[] args) {
System.out.println(3 << 2);
System.out.println(24 >> 2);
System.out.println(24 >>> 2);
System.out.println(-24>>2);
System.out.println(-24>>>2);
}
}
<<:左移:向左移动,最高位丢弃,右边补0
>>:右移:向右移动,最高位是0,左边补0,最高位是1,左边补1
>>>:无符号右移:向右移动,无论最高位是0还是1,右边都用0补齐
分析:
想要参与位运算,就必须得先知道二进制
1、计算出3的二进制:11
3的二进制补码:
00000000 00000000 00000000 00000011
(00)00000000 00000000 00000000 00001100
结果是:12
2、计算出24的二进制:11000
24的二进制的补码:
00000000 00000000 00000000 00011000
00000000 00000000 00000000 00000110(00)
结果是:6
3、计算出24的二进制:11000
24的二进制的补码:
00000000 00000000 00000000 00011000
00000000 00000000 00000000 00000110(00)
结果是:6
4、计算出24的二进制:11000
原码: 10000000 00000000 00000000 00011000
反码: 11111111 11111111 11111111 11100111
补码: 11111111 11111111 11111111 11101000
-24的补码:
11111111 11111111 11111111 11101000
11111111 11111111 11111111 11111010(00)
补码:11111111 11111111 11111111 11111010
反码:11111111 11111111 11111111 11111001
原码:10000000 00000000 00000000 00000110
结果是:-6
5、 计算出24的二进制:11000
原码: 10000000 00000000 00000000 00011000
反码: 11111111 11111111 11111111 11100111
补码: 11111111 11111111 11111111 11101000
-24的补码:
11111111 11111111 11111111 11101000
00111111 11111111 11111111 11111010(00)
结果是:1073741818