位运算符:针对二进制的值补码形式进行计算的
& | ^(相同为0,不同为1) ~ << >> >>>
public class WeiOptDemo1 {
public static void main(String[] args) {
byte a1 = 3;
byte b1 = 4;
System.out.println(a1 & b1);System.out.println(a1 | b1);System.out.println(a1 ^ b1);System.out.println(~ b1);
}
}
计算机中所有数据的运算都是采用补码的形式进行的
3的补码:00000011
4的补码:00000100&运算 有0则000000011&00000100--------------00000000 => 0|运算 有1则100000011|00000100--------------00000111 => 7^运算 相同则0,不同则100000011^00000100--------------00000111 => 7~运算 1变成0,0变成1~ 00000100--------------
补码 11111011
反码 11111010
原码 10000101
=> -5
<< : 左移,右边用0补齐,相当于乘上2的n次方
>> : 右移,左边空出来的,看最高位是1还是0,若是1就用1补齐,若是0就用0补齐,相当于除上2的n次方
>>>: 无符号右移,左边空出来的,无论最高位是0还是1,都用0补齐
public class WeiOptDemo2 {
public static void main(String[] args) {
byte b1 = 5;
System.out.println(b1<<2); // 20 = 54 = 52^2
System.out.println(b1<<3); // 5*2^3 = 40
System.out.println(b1<<5);
System.out.println(24>>2); // 6=24/4=24/2^2System.out.println(-24>>2); // 6=-24/4=-24/2^2System.out.println(-24>>>2); //}
}
b1的补码:00000101<<2位:00000101(00)00010100 -> 20-----------24的补码:00011000
24>>2位:0001100000000110(00)----------- -> 6-24的原码:10011000-24的反码:11100111-24的补码:11101000-24>>2:11101000补码: 11111010(00)------------------------已知补码求原码:补码: 11111010反码: 11111001原码: 10000110---------------- -> -6-24的原码:10000000 00000000 0000000 00011000-24的反码:11111111 11111111 1111111 11100111-24的补码:11111111 11111111 1111111 11101000-24>>>2:11111111 11111111 1111111 111010000011111111 11111111 1111111 111010(00)--------------------------------------- -> 1073741818