1.逻辑操作符
java中逻辑操作符有:&长路与 、&&短路与、|长路或 、||短路或、!取反、^异或。其中:
&长路 和&&短路与 :无论是长路与还是短路与 ,两边的运算单元都是布尔值 ,任意为假 ,就为假,都为真时才为真
区别:长路与&,两侧都会被运算。短路与&& ,只要第一个是false ,第二个就不进行运算了。
|长路或和||短路或:无论长路还是短路或 ,两边的运算都是布尔值。都为假时,才为假 。任意为真时,就为真
区别:长路或|,两边都会被运算 。短路或||,只要第一个时true,第二个就不进行运行了 。
!取反:真变为假 ,假变为真。
^异或:不同,返回真。相同,返回假。
public class demo07 {
public static void main(String[] args) {
//1.长路与& 和 短路与&&
int i = 1;
System.out.println(i== 2& i++ ==2);//两边都运行了 i=2
System.out.println(i);
int m=1;
System.out.println(m==2&&m++==2);//第一个为false,第二个没有运行 m=1
System.out.println(m);
//2.长路或| 和 短路或 ||
int i2 =1;
System.out.println(i2==1|i2++==2);//两边都运行了
System.out.println(i2);//2
int m2 = 1;
System.out.println(m2==1||m++==2);//当第一边为true,第二边就不再运行了
System.out.println(m2);//1
//3.取反!
boolean b = true;
System.out.println(b);//输出true
System.out.println(!b);//输出false
//4.异或
boolean x = true;
boolean c = false;
System.out.println(x^c);// true
System.out.println(x^!c);//false
System.out.println(!x^c);
}
}
2.位操作符
位操作符:左移 <<、右移>>、无符号右移>>>,位或 |,位与 & 、异或 ^,取非 ~
左移<<: 根据一个整数的二进制表达,将其每一位向左移动,最右边一位补0
右移>>:也称之为有符号右移。根据一个整数的二进制表达,将其每一位向右移动。对于正数, 带符号右移 >> 会把所有的位右 移,并在最前面补0;对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1。
无符号右移>>>:
* 如果是一个负数,那么对应的二进制的第一位是1
* 无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
* 这样就会使得负数在无符号右移后,得到一个正数
位或| :将两个位或的数据进行相加 两个都为1的还是1 。一个为1,一个为0,则变为1。0的还是0。
位与&:将两个数据进行位的相乘 两个位都为1的还是1 ,一个为1,一个为0,则变为0,0的还是0。
异或 ^:
* m 00001001
* ^
* n 00001010 ——>011 下标相同的位置,位数据不同的留下,相同丢掉
取非 ~:
* 5的二进制:0000 0101
* 取反为: 1111 1010 -6
*
* 6的二进制:00000110
* 取反为: 11111001 -7
* 0的二进制: 00000000 00000000 00000000 00000000
* -1的二进制: 11111111 11111111 11111111 11111111
package day01;
/**
* 位操作符
* @author wangli
*
*/
public class demo08 {
public static void main(String[] args) {
/**
* 左移 <<
* 根据一个整数的二进制表达,将其每一位向左移动,最右边一位补0
* 右移>>
* 根据一个整数的二进制表达,将其每一位向右移动
*
* 带符号右移 >>
* 对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0
* 对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1
* 无符号右移>>>
* 如果是一个负数,那么对应的二进制的第一位是1
* 无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0
* 这样就会使得负数在无符号右移后,得到一个正数
*
*/
System.out.println(-2>>>3);
System.out.println(2<<3);//最快得到16
System.out.println(3<<3);//最快得到24
//右移 >>
System.out.println(24>>2);
//位或 | 将两个位或的数据进行相加 两个都为1的还是1 ,一个为1,一个为0,则变为1,0的还是0
int m=5,n=6;
System.out.println(Integer.toBinaryString(m));//00001001
System.out.println(Integer.toBinaryString(n));//00001010
System.out.println(Integer.toBinaryString(m|n));//00001011
System.out.println(m|n);
//位与 & 将两个位或的数据进行相乘 两个都为1的还是1 ,一个为1,一个为0,则变为0,0的还是0
System.out.println(m&n);//00001000
/** 异或 ^
* m 00001001
* ^
* n 00001010 ——>011 位置数据不同的留下,相同丢掉
*/
System.out.println(m^n);//
/**
* 控制台输出二进制的时候将左侧全为0的省略掉了
* 取非 ~
* 5的二进制:0000 0101
* 取反为: 1111 1010 -6
*
* 6的二进制:00000110
* 取反为: 11111001 -7
* 0的二进制: 00000000 00000000 00000000 00000000
* -1的二进制: 11111111 11111111 11111111 11111111
*
*
*/
System.out.println(~5);//11111111 11111111 11111111 11111010
System.out.println(Integer.toBinaryString(-1));//11111111 11111111 11111111 11111111
}
}