java逻辑运算和位运算总结
1. &&和&有什么区别? ||与|有什么区别?
(1)&&表示短路与
(2)对于&与来说,所有条件都要判断,而如果使用短路与,如果第一个条件为false,则后面的条件将不在判断
(1)||表示短路或
(2)对于或|来说,要求说有条件都要判断,而如果使用短路或,如果第一个条件为true,怎后面的条件将不在判断
例如
"与"的功能:
【1】&的功能
public class OperateDemo10{
public static void main(String args[]){
if(10!=10&10/0==0){ //10!=10和10/0两个条件都判断了;程序报错
System.out.println("条件满足") ;
}
}
};
【2】短路与的功能
public class OperateDemo11{
public static void main(String args[]){
if(10!=10&&10/0==0){ //只要第一个条件满足,往后代码不在执行,不报错
System.out.println("条件满足") ;
}
}
};
"或"的功能:
【1】|的功能
public class OperateDemo12{
public static void main(String args[]){
if(10==10|10/0==0){ //所有条件都要判断
System.out.println("条件满足") ;
}
}
};
【2】||的功能
public class OperateDemo13{
public static void main(String args[]){
if(10==10||10/0==0){ //第一个条件满足, 将不在判断
System.out.println("条件满足") ;
}
}
};
java逻辑运算和位运算总结(二)
2.如何处理取反运算符~?
【1】对于整数来说:
public class BitOperation {
public static void main(String args[]){
int a=5;
System.out.println("~a="+(~a));
}
}
运算结果是-6
首先你要知道现在我们用的多数都是32位机,所以整形数都是4个字节
那么再看看按位取反的结果:
00000000 00000000 00000000 00000101 这是5
00000000 00000000 00000000 00000000 这是0
11111111 11111111 11111111 11111111 这是-1
11111111 11111111 11111111 11111110 这是-2
11111111 11111111 11111111 11111101 这是-3
11111111 11111111 11111111 11111100 这是-4
11111111 11111111 11111111 11111011 这是-5
11111111 11111111 11111111 11111010 这是5取反的结果-6
【2】对于负数来说
public class OperateDemo16{
public static void main(String args[]){
int x = -3 ; //-3 应该以补码的形式存在,补码 = 反码 + 1
System.out.println(~x) ;
}
};
其中第一位表示符号位
1000000 00000000 00000000 00000011 -> -3的原码
1111111 11111111 11111111 11111100 -> -3的反吗
1111111 11111111 11111111 11111101 -> -3补码
0000000 00000000 00000000 00000010 -> ~-3取反
3.如何处理左移和右移
public class OperateDemo18{
public static void main(String args[]){
int x = 3 ; // 3的二进制数据: 00000000 00000000 00000000 00000011
int y = -3 ; // -3的二进制数据: 11111111 11111111 11111111 11111101
System.out.println(x + "右移2位之后的内容:" + (x>>2)) ;
System.out.println(y + "右移2位之后的内容:" + (y>>2)) ;
}
};
关于无符号右移
public class OperateDemo19{
public static void main(String args[]){
int x = 3 ; // 3的二进制数据: 00000000 00000000 00000000 00000011
int y = -3 ; // -3的二进制数据: 11111111 11111111 11111111 11111101
System.out.println(x + "右移2位之后的内容:" + (x>>>2)) ;
System.out.println(y + "右移2位之后的内容:" + (y>>>2)) ;
}
};
00000000 00000000 00000000 0000011 ->3的原码
补2个0 移出2位
00000000 00000000 00000000 000000011 ->无符号右移2位 结果为0
11111111 11111111 11111111 111111101 ->-3的补码(-3在计算机以补码存在)
补2个0 移出2位
00111111 11111111 11111111 11111111101 ->无符号右移2位 结果为数很大