运算符(中)逻辑运算符和位运算符
逻辑运算符
逻辑运算符规律(通过boolean进行运算的)
运算符 | 用法 | 含义 |
---|---|---|
与(&&) | op1&&op2 | 逻辑与 |
或(||) | op1||op2 | 逻辑或 |
非( !) | !op | 逻辑非 |
逻辑运算符号运算规则
op1 | op2 | op1&&op2 | op1||op2 | !op1 |
---|---|---|---|---|
true | true | true | true | false |
true | false | false | true | false |
false | ture | false | true | true |
false | false | false | false | true |
逻辑运算符测试代码
package package_01;
public class Demo_02 {
public static void main(String[] args) {
//运算符与(&&)或(||)非!代码测试
boolean a=true;
boolean b=false;
System.out.println("a&&b:"+(a&&b));//如果a是true 并且b是false那么他会先算a然后算b发现b是假的那么&&返回结果就是false了
System.out.println("a||b:"+(a||b));//如果a是true,湖或者b是false,返回就是true
System.out.println("a!b:"+!(a||b));//如果是非(a或者b)返回结果是false
System.out.println("a!b:"+!(a&&b));//如果是非a与b,返回结果就是true
System.out.println("=============================================");
//当在执行的时候如果第一个返回的就是错的,代码将不会执行,如果是对的会执行之后在判断
int c=5;
boolean d=(c<4)&&(c++>4);//c<4是错误的,那么代码执行的时候发现错误之后后面c++>4这个就不会执行了所以后面的c打印出来是没有+1的
System.out.println(d);
System.out.println(c);
System.out.println("==============================================");
boolean e=(c++>5)&&(c++<4);//当第一个满足条件之后,他就不会短路,他会执行完第一个,然后在执行c++<4当发现错误之后就会返回false但是打印c会+1
System.out.println(e);
System.out.println(c);
}
}
位运算符
概括
所谓位运算符,把人搞的一头雾水,“位”到底是个什么玩意儿呢?“位”既然修饰“运算符”,那么就说明“位运算符”是按位运算的,按“位”运算,前提是有“位”,这个为“位”从哪来呢?这就是位运算符的高级之处了,位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算。
位运算符的符号及规则
“按位与”运算符“&”,规则:全1则1,否则为0
位1: 000101 0010110110001
位2: 100100 0110010000001
结果:000100 0010010000001
“按位或”运算符“|”,规则:全0则0,否则为1。
位1: 000101 0010110110001
位2: 100100 0110010000001
结果:100101 0110110110001
“按位非”运算符“~”,规则:遇1则0,遇0则1。
位非:000101 0010110110001
结果:111010 1101001001110
“按位异或”运算符“^”,规则:相同为0,不同为1。
位1: 000101 0010110110001
位2: 100100 0110010000001
结果:100001 0100100110000
ps:按位异或很奇妙,使用两次则还原:
3 ^ 5 = 6;
6 ^ 5 = 3;
位左移 “<<” 和 位右移">>“还有”>>>"
“<<” 位左移 将数字乘以2
3<<2=3*4=12 3<<1=3*2=6 3<<3=3*8=24
">>"位右移 将数字除以2
“>>” 表示右移,如果该数为正,则高位补0,若为负数,则高位补1。如:int i=15; i>>2的结果是3,移出的部分将被抛弃
6>>1=6/2=3 6>>3=6/8=0.75(取整数0) 6>>2=6/4=1.5(取整数1)
">>>"表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
package package_01;
public class Demo_3 {
public static void main(String[] args) {
/*
<<叫做位左移 计算结果是乘以2
比如我 2✖8=16 为2*2*2*2
3<<2=3*4=12 3<<1=3*2=6 3<<3=3*8=24
6>>1=6/2=3 6>>3=6/8=0.75(取整数0) 6>>2=6/4=1.5(取整数1)
* */
System.out.println(2<<3);//相当于2*(2^3)=2*8=16
System.out.println(3<<4);//相当于3*(2^4)=3*16=48
System.out.println("==========================");
System.out.println(6>>1);//相当于6/(2^1)=6/2=3
System.out.println(6>>2);//等于6/(2^2)=1余数为2,取整数为1
System.out.println(6>>3);//等于6/(2^3)=0余数是2,取整数0
System.out.println("=====================================");
System.out.println(6>>>1);
System.out.println(6>>>3);
}
}
">>>“和”>>"区别
“>>”表示是带符号的右移:按照二进制把数字右移指定数位,符号位为正补零,符号位负补一,低位直接移除。“>>>”表示无符号的右移:按照二进制把数字右移指定数位,高位直接补零,低位移除。
package package_01;
public class Demo_04 {
public static void main(String[] args) {
int a=10;
System.out.println("十进制:"+a+"二进制:"+Integer.toBinaryString(a));
int b=a>>2;
System.out.println("右移两位十进制:"+b+"右移两位二进制:"+Integer.toBinaryString(b));
System.out.println("===========================================================");
int c=10;
System.out.println("十进制:"+c+"二进制:"+Integer.toBinaryString(c));
int d=c>>>2;
System.out.println("右移两位十进制:"+d+"右移两位二进制:"+Integer.toBinaryString(d));
System.out.println("===============================================================");
for (int i=0;i<10;i++){
for (int j=0;j<500;j=j+5){
System.out.println(j/(int)Math.pow(2,i));
System.out.println(j>>>i);
}
}
}
}
for (int j=0;j<500;j=j+5){
System.out.println(j/(int)Math.pow(2,i));
System.out.println(j>>>i);
}
}
}
}