黑马程序员-----java基础之运算符----与(&)、或(|)、非(!)、异或(^)、短路与(&&)等

来源:互联网 发布:数据共享方式比较 编辑:程序博客网 时间:2024/06/12 23:14

 

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

 

 

java运算符

运算符:主要包括位运算符,逻辑运算符,三元运算符

位运算符是针对二进制数进行运算,而计算机的底层都会把数据转换成二进制来进行存储和计算
位运算符包括:与(&),或(|),按位取反(~),异或(^),左移(<<),右移(>>),无符号右移(>>>)
A:这些运算符在运用的时候,虚拟机会把数据转换成二进制来进行运算,将每一位都按给定的运算符进行处理,下面我们有代码实现
与运算(&)
public class OperatorDemo1 {


public static void main(String[] args) {
int x = 8 ;
int y = 7 ;
int  a = 12;
int  b = 15;
System.out.println("7和8的位运算与的结果:"+(x&y));
System.out.println("7和8的位运算与的结果:"+(a&b));
}
}
上面的代码在内存是是这样实现的,首先将8转换成8位二进制数00001000 ,将7转换成00000111,然后将两个二进制数按位运算,与运算必须是两个都是1结果才是1,有一个其中是0,结果则为0,所以结果为00000000,然后在打印出来,虚拟机默认为十进制,则把00000000转换成十进制,结果为0。a和b的运算也是如此,12的二进制为00001100,15的二级制为00001111,结果为00001100,转换成十进制为12;
或运算( | )
public class OperatorDemo2 {
public static void main(String[] args) {
int w = 15;
int z = 16;
System.out.println("w和z的或运算结果为:"+(w|z));

}
}
或运算在实现的时候流程和与是相似的,都是首先把数据转换成二进制数,再进行或,15的二进制数是00001111,16的二进制数是00010000,而或的运算法则是两个数有一个是1,结果就是1,如果两个都是0结果才为0,结果为00011111,转换成十进制为31。
异或运算符(^)
public class OperatorDemo3 {
public static void main(String[] args) {
int s = 5 ;
int d = 10 ;
System.out.println("s和d的异或运算结果是:"+(s^d));
}
}
异或的运算规则为两个二进制数每个位上的数不一样结果才为一,也就是说一个是1,一个是0,才为1,否则为0,5 的二进制数为00000101,6的二进制数为00001010,异或之后为00001111,转换成十进制数为15。
按位取反(~)
public class OperatorDemo4 {
public static void main(String[] args) {
int e = 15;
int r = 10 ;
System.out.println("e的按位取反结果是:"+(~e));
System.out.println("r的按位取反结果是:"+(~r));
}
}
e的按位取反结果是:-16
r的按位取反结果是:-11
计算机底层都是安二进制数进行运算,这里会涉及到原码,反码和补码的运算,在此不做说明,15的原码为00001111,其实是四个八位的二级制数,但是在此我简略写成8位,之前有24,最前面的以为是符号为,0代表整数,1代表负数,取反之后0为1,15的补码为11110000,反码为11101111,原码为00010000,但是最前面的符号为仍为1,所以是负数,位-16。
左移(<<),右移(>>),无符号(>>>)
public class OperatorDemo5 {
public static void main(String[] args) {
int a = 24 ;
System.out.println("a的左移2位结果是:"+(a<<2));
System.out.println("a的右移2位结果是:"+(a>>2));
System.out.println("a的右移2位结果是:"+(a>>>1));
int b = -24 ;
System.out.println("b的右移2位结果是:"+(b>>2));
}
}
a的左移2位结果是:96
a的右移2位结果是:6
b的右移2位结果是:12
b的右移2位结果是:-6

a 左移2位原理是:00011000  运算之后为01100000 ,为96,相当于24*(2*2)=96。
a右移2位原理是:00011000运算之后为00000110,为6,相当于24/(2*2)= 6。
a无符号右移2位原理是:00011000运算之后为00000110,为6相当于24/(2*2)= 6。
总结规律:
左移几位,就是乘以以2的几次幂
右移几位,就是除以2的几次幂
运算符的功能说明完了,下面我们来学习一下运算符的运用,值得一提的是异或的特殊运用
一个数被另一个数异或两次,其值不变,可运用在数值交换,但这种方法不易懂,书写也有弊端,所以很少被使用
public class OperatorTest {
public static void main(String[] args) {
int a = 3 ;
int b = 4 ;
System.out.println("a="+a);
System.out.println("b="+b);
a = a ^ b ; //a = a ^ b;
b = a ^ b ; //b = a ^ b ^ b 这个时候a的值给了b
a = a ^ b ; //a = a ^ b ^ a ^ b ^ b这个时候把b的值给了a
System.out.println("----------------------------");
System.out.println("a="+a);
System.out.println("b="+b);
}


}
a=3
b=4
----------------------------
a=4
b=3
B:逻辑运算符,包括与(&),或(|),非(!),短路与(&&),短路或(||)
下面代码实现一下
public class OperatorDemo6 {

public static void main(String[] args) {
int a = 10 ;
int b = 20 ;
int c = 30 ;
System.out.println(a > b & a < b);//a>b为false a<b为true false&true为false
System.out.println(a < b & b < c);//a<b为true b<c为true true&true为true
System.out.println("--------------------------------");
System.out.println(a > b | a < b);//a>b为false a<b为true false|true为true
System.out.println(a > b | b > c);//a>b为false b>c为false false为false为false
System.out.println("--------------------------------");
System.out.println(a > b ^ b > c);//a>b为false b>c为false false^false为false
System.out.println(a > b ^ b < c);//a>b为false b<c为true false^true为true
System.out.println("---------------------------------");
System.out.println((a > b));//a>b为false
System.out.println(!(a > b));//a>b为false,!false为true
System.out.println(!!(a > b));//a>b为false,!false为true,!!false为false
}
}
总结规律
与运算,全部为真才为真
或运算,全部为假才为假
异或运算,不一样为真,一样为假
非假为真,非真为假
短路与(&&),短路或(||)
public class OperatorDemo7 {

public static void main(String[] args) {
int a = 4 ;
int b = 5 ;
System.out.println((a == 5)&&( a++ == 5));//a==5位false,右面不运算
System.out.println(a);
System.out.println((a == 4)&&(a++ == 4));//a==4位true ,右面才运算
System.out.println(a);
System.out.println("---------------------------");
System.out.println((b == 5)||(b++ == 5));//b==5为true,右面不运算
System.out.println(b);
System.out.println((b == 6)||(b++ ==6));//b==6位false ,右面才运算
System.out.println(b);
}
}
总结规律:
短路与:只要左面为假,就不用运算右面的了,只有左面为真,才看右面
短路或:只要左面为真,就不用运算右面的了,只有左面为假,才看右面
只要左面可以决定整体的结果,就不用管右面的了
C:三元运算符
格式:(关系表达式)?表达式1 :表达式2 
计算关系表达式的值,如果为真,运行表达式1,如果为假,运行表达式2
代码实现
public class OperatorDemo8 {
public static void main(String[] args) {
int a = 10 ;
int b = 20 ;
int x = (a == b)? a++ : b++;
System.out.println(x);
System.out.println(a);
System.out.println(b);
System.out.println("--------------------------");
int max = (a > b) ? a : b;
System.out.println(max);
}
}



总结:本人也在java的学习之中,这是我作为学习笔记的一种形式,也是对自己的一种督促,同时也希望各位朋友们指出我的错误指出和不足,大家一起进步,一起努力,学编程是一条很孤独很艰难的路,如果有有缘的朋友看到我的文章,请不吝赐教,谢谢
0 0
原创粉丝点击