java位运算,逻辑运算
从结果上来看&&与&的结果是一样的, 如果左边为false,右边表达式不会执行,整体结果为false
从结果上来看||与|的结果是一样的, 如果左边为true, 右边表达式不会执行,整体结果为true
位运算符:针对二进制的值补码形式进行计算的
& | ^(相同为0,不同为1) ~ << >> >>>
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则0
00000011
&
00000100
--------------
00000000 => 0
|运算 有1则1
00000011
|
00000100
--------------
00000111 => 7
^运算 相同则0,不同则1
00000011
^
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 = 5*4 = 5*2^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^2
System.out.println(-24>>2); // 6=-24/4=-24/2^2
System.out.println(-24>>>2); //
}
}
b1的补码:00000101
<<2位:
00000101
(00)00010100 -> 20
-----------
24的补码:00011000
24>>2位:
00011000
00000110(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 11101000
0011111111 11111111 1111111 111010(00)
--------------------------------------- -> 1073741818