一、位运算
1、定义:程序中的所有数在计算机内存中都是以二进制补码的形式存储的。位运算就是直接对整数在内存中的二进制补码进行操作。
2、分类:
符号 | 名称及运算规则 |
---|---|
& | 按位与:全1为1,否则为0 |
按位或:全0为0,否则为1 | |
^ | 按位异或:相同为0,否则为1 |
~ | 按位取反:0变为1,1变为0 |
>> | 右移:补码向右移动相应位数,负数高位补1,正数补0 |
<< | 左移:向左移动相应位数,低位补0 |
>>> | 无符号右移:向右移动相应位数,高位补0 |
//按位与
final byte a = 4;//二进制补码为:0000 0100
final byte b = 5;//二进制补码为:0000 0101
byte c = a & b;//运算后的二进制补码为:0000 0100
System.out.print(c);//输出结果为4
final byte a = -4;//二进制补码为:1111 1100
final byte b = 5;//二进制补码为:0000 0101
byte c = a & b;//运算后的二进制补码为:0000 0100
System.out.print(c);//输出结果为4
//按位或(符号为|)
final byte a = -4;//二进制补码为:1111 1100
final byte b = 5;//二进制补码为:0000 0101
byte c = a | b;//运算后的二进制补码为:1111 1101
System.out.print(c);//输出结果为-3
//按位异或
final byte a = -4;//二进制补码为:1111 1100
final byte b = 5;//二进制补码为:0000 0101
byte c = a ^ b;//运算后的二进制补码为:1111 1001
System.out.print(c);//输出结果为-7
//按位非
final byte a = -4;//二进制补码为:1111 1100
byte c = ~a;//运算后的二进制补码为:0000 0011
System.out.print(c);//输出结果为3
//右移
final byte a = -4;//二进制补码为:1111 1100
byte c = a>>2;//运算后的二进制补码为:1111 1111
System.out.print(c);//输出结果为-1(相当于除以2^2)
//无符号右移
final int a = -4;//二进制补码为:1111 1111 1111 1111 1111 1111 1111 1100
int c = a>>>2;//运算后结果为:0011 1111 1111 1111 1111 1111 1111 1111
System.out.print(c);//输出结果为1073741823
//左移
final byte a = -4;//二进制补码为:1111 1100
byte c = a<<2;//运算后结果为:1111 0000
System.out.print(c);//输出结果为-16(相当于乘2^2)
二、逻辑运算
1、定义:逻辑运算又称布尔运算。java中逻辑运算符的俩边应为Boolean类型。
2、分类:
符号 | 名称及其运算规则 |
---|---|
&& | 逻辑与:全真为真,否则为假 |
逻辑或:全假为假,否则为真 | |
! | 逻辑非:真变为假,假变为真 |
//逻辑与
if(false && true){
System.out.print("if中的运算结果为true");//if中运算结果为false,因此此处不执行
}else{
System.out.print("if中的运算结果为false");//if中运算结果为false,因此此执行
}
//逻辑或
if(false || true){
System.out.print("if中的运算结果为true");//if中运算结果为true,因此此处执行
}else{
System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
}
//逻辑或的短路
int a = 10, b = 10;
if((a=0)==0 || (b=0)==0){
System.out.print(b);//if中运算结果为true,因此此处执行,并且(a=0)==0为true,所以(b=0)==0)不再执行
}else{
System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
}
//逻辑非
if(!false){
System.out.print("if中的运算结果为true");//if中运算结果为true,因此此处执行
}else{
System.out.print("if中的运算结果为false");//if中运算结果为false,因此此不执行
}
逻辑运算与位运算的区别:
1、运算对象的不同 :逻辑运算只针对Boolean类型的数据 ,位运算还可以对二进制补码进行运算。
2、逻辑或存在短路情况,按位或则不存在。
3、按位取反~与逻辑非!为单目运算符,其余的为双目运算符他们的优先级规则为! ~ << >> & ^ | && || (其他运算符优先级可参照百度)
4、按位异或可以实现不声明第三变量的情况下的俩个数字的交换
int a = 1, b = 2;
a = a ^ b;
b = a ^ b;//相当于a^b^b结果为a
a = a ^ b;//相当于a^b^a结果为b
System.out.print("a:" + a + ",b:" + b);//输出结果为:a:2,b:1
写在最后:java小白一枚,有错误或修改意见请大神指出!!!感激不尽!!!