从零开始学java-(五)for ZCL:java运算符2

   继续上一篇,接着来说说java的运算符;之前列举了java十种常用的运算符,身边的一位大神问是我自己列出来的么?我说不是。。。他说他也觉得,我哪有那么无聊!!说这个事儿,是想说,这些知识重要也不重要,一定要知道,但不一定要100%一点儿不差的记住,除非记忆力惊人另说;常用的一定要熟悉,就ok。好了,说正事儿

   上一篇说完了关系运算符,来说说逻辑运算符;

    为什么那么多运算符不说,单独说这个逻辑运算符呢?因为逻辑运算符一般都是与关系运算符结合起来用的。

逻辑运算符,一共有三个:和,或,非,异或,符号,却有6个,先来看看这些符号:&, |, !, ^(shifit +键盘上面那个一行的6), &&, ||

   前四个可以对应上,那后两个死怎么回事儿?双和,双或?

   可不是这么累加的, 这个问题我们先放着,先来说说这几个运算符;

    和,就是and,可以理解为并且,比如:a >0 & a < 10;就是说,a要同时满足两个条件,这个同时,就是我们的运算符了;

   或,就是or,可以理解为或者,比如: a > 0 | a <0 ;  就是说,a大于零或者小于零,当然,这个仅仅是例子,没任何意义的。

   非,就是not,可以理解为不是,比如 !(a >0);就是说不是a大于零,,那就是a小于零了 

   先理解理解,我来上段代码,给大家瞧瞧

   

public class LogicOperators{
		
	public static void main(String[] args){
		int var1 = 10;
		int var2 = 3;
		int var3 = 5;
		System.out.println("var1大于var2,并且var1大于var3么?" + ((var1 > var2) & (var1 > var3)));
		System.out.println("var1大于var2,并且var1大于var3么?" + ((var1 > var2) && (var1 > var3)));
		System.out.println("var1大于var2或者var1大于var3么?" + ((var1 > var2) | (var1 > var3)));
		System.out.println("var1大于var2或者var1大于var3么?" + ((var1 > var2) || (var1 > var3)));
		System.out.println("var1不大于var2么" + !(var1 > var2));			
	}

}
    ,废话少说,直接看结果了

 

    
从零开始学java-(五)for ZCL:java运算符2_第1张图片
   在你编写程序的时候,是否有想到过&和&&的结果是一样,|和||的结果是一样的呢?
    不管怎么说,我们实践的结果就是一样的,或者说,单个的和与双个的和最终的结果是一样,单个的或与双个的或我就不多说了,只说和,两者都一样,单个和双个最终结果是相同的没错,但是他们的运算过程是不同;单个的会从头运算到尾部,最后才停止,而双个的,我们俗称短路和,短路或,他们运算到可以推断是最终结果时停止运算,比如使用短路或,int a =10; a >0 || b > 0; 这种条件下,a >0 已经成立,可以推断出结果为真,所以就不需要再继续运算,不会进行b>0的比较,这个要记好了,我们常用的还是双的,相率要高;
  细心的同学可能已经发现了,我们的事例里面没有异或这个运算符,这个运算符,有些资料说,两个一样是真,不一样就是假,不知道是我没能理解还是情景不一样,经过自己动手实验,得出以下结果,逻辑运算符中的异或:两个表达式,不一样,则结果为真,一样,则结果为假;比如 (1 > 10) ^ (1>5)他的结果就是 false,因为两个表达式的结果一样;
 好了,逻辑运算符就到此为止了,下面我来了解下位运算符,这个位运算符,有点儿意思,他主要是针对二进制进行运算,运算符包括了四种:与,或,非,异或;嗯?是不是和逻辑运算很像,没错,很像,非常像,除了没有短路和,短路或,几乎一模一样,但也仅仅是看上去,使用起来则是完全不同,我们来一个一个了解;
  1,与运算符,符号:&
  运算规则如下:两个操作数都为1的情况下,结果才为1,否则结果为0.先来看个表达式:int a =129; int b=128; a&b的结果是什么呢?(⊙o⊙)…,129里面有2和9怎么办啊? 哦,对了,位运算符是对二进制,也就是说需要将129和128转换成二进制才能计算,二进制之前提到过,都是1和0,怎么转化二进制了?回想下,想不起来的看看之前的文章,或者自己去搜搜吧!好了,我来看例子,
public class BitOperators{
		
	public static void main(String[] args){
		int var1 = 129;
		int var2 = 128;
		
		System.out.println("var1与var2的结果是" + (var1&var2));
			
	}

}
 按照刚才说的,先转成二进制,129二进制是10000001,128二进制是10000000, 对照下计算规则,我们得到了10000000,啊哦,恰好是128,那么我们打印出来的结果是不是128呢?
来看看运行的结果

从零开始学java-(五)for ZCL:java运算符2_第2张图片
  bingo,就是128,你算对了没?
2,或运算符,符号 |
 运算规则:两个数只要有一个是1,结果就是1,否则就是0,强调下,这个的两个数,只是两个二进制数的相同位数上的树!。具体的转化法则,这里就不多说了,去搜搜,有很多好的方法,肯定只会比我的好;
还是刚才的例子,只不过是把 &改成|,我就偷偷懒,读者可别偷懒。。自己动手看看运行结果,根据我们的口算,貌似是10000001,正好是129,看看结果对不对?
3,非运算符:符号 ~(这个符号是shift+ esc附近的那个符号,貌似在esc下面)
 运算规则:非,其实也就是取反,如果位是0那么结果是1,反过来,如果位是1,那么结果是0,也就是说前两个是两个二进制数进行计算,而这个,只有一个二进制数计算,例如:int var =2; ~a是多少?
 先来口算下,2的二进制是0010,取反,那么死1101,而二进制中最高位代表负号。最终结果就是-3了,为什么是-3?这个就涉及到了计算机基础了,负数的二进制,这个非运算的结果其实是0011这个二进制取反加1的结果,而0011这个二进制的十进制数3,又是负数,所以就是-3了,这个还需要大家好好补一补计算机基础,不然这里很难理解,直接看看程序吧:
  
public class BitOperators{
		
	public static void main(String[] args){
		int var1 = 2;		
		System.out.println("非var1的结果是" + (~var1));
			
	}

}
  结果毋庸置疑,-3
 
从零开始学java-(五)for ZCL:java运算符2_第3张图片
  4,异或运算符,符号^
 运算规则:两个操作数,相同,结果为0,不同则结果为1;这个概念刚才提到了!就是在逻辑算符的异或那里,现在知道哪里是哪里吧?一些资料说的都是对的,一定要分清楚是什么操作符!
 来两个表达式 int var1 = 15; int var2 = 2; 那么var1 ^ var2是多少呢?自己算算,我就直接给上程序了
  
public class BitOperators{
		
	public static void main(String[] args){
		int var1 = 15;
		int var2 = 2;		
		System.out.println("15异或运算2结果是" + (var1^var2));
			
	}

}
   提醒下,15的二进制是1111,2的二进制是0010,算算。。
来看结果


 
,好了,位运算符到此结束,结束之前,来个温馨提示,我们上面写道的二进制并不是完整的二进制,而是简化的,因为完整的二进制数很长,比如我们用的类型 int,这个说过是4个字节,每个字节8位,那么完整的int型二进制数应该是32位的,2应该就是30个0在加上10,长度。。太长了。所以我们都是写的简化的,注意,你以后看见的应该都是这样的简化方式;因为没人会无聊到写30个0出来吧,我想。。。
  下面我们要说的运算符,还是和二进制有关,叫做移位运算符,有没有点儿感觉,是怎么回事儿呢。移动位运算符有木有,有三种运算符:左移运算符,右移运算符,无符号右移运算符
 1,左移运算符,符号:<<
 先来个表达式 2<<2
 看着这个表达式,来看运算规则,是想运算符(<<)左边的这个数向左移动运算 符号右边制定的位数;
也就是说这个表达式的意思是把2向左移动2位,在低位补0,来看个例子
 
public class BitMoveOperators{
		
	public static void main(String[] args){
		int var1 = 2;
		int var2 = 2;		
		System.out.println("var1 << var2 结果是" + (var1 << var2));
			
	}

}
   先来分析一下,2的二进制,经常提到0010,向左移动两位那么应该是1000,算下十进制,就是8,看2是什么关系,别说是4倍。除了这个呢?没错,2的3次方,推理下,2向左移动两位结果是2的3次方,貌似是2乘以2的2次方嘛!是的,其实向左移动两位,就是乘以2的2次方,
看看运算结果:
 
从零开始学java-(五)for ZCL:java运算符2_第4张图片
 ok,和我算的一样!
 2,右移运算符,符号:>>
  表达式毫无新意。。。16>>2, -16>>2
 运算规则:这个右移也叫做有符号右移,简化来说,符号左边的数向右移动,移动符号右边制定的位数,上面那两个表达式就是16向右移2位,-16向右移2位,注意了,既然有符号,分正负了,那么在补齐的时候就不一样了,如果是正数,在高位补0,如果是负数,在高位补1,补1的原因,刚才顺带提到过。。二进制高位代表符号;
  自己算算结果如何?这个例子就不给代码了,结合前面的例子,独立完成这个实例;提示,声明三个变量,变量值分别是16 ,-16,2,打印出来上面的两个表达式的值,go,我相信你的;
  3,无符号右移运算符,符号:>>>
  表达式:16 >>>2
 运算规则,其实跟右移差不多,只是他不存在负数的情况,就相当于是左边的数除以2的右边数的次方
上面的表达式而言,就是16除以2的2次方,这里其实是巧合,如果表达式是16 >>>3,就是16除以2的3次方了。要分清楚哦;
  代码。。。木有。。。自己写写看,这个时候该独立完成事例了!耐心点儿,可以多参看下之前的例子,怎么写的;
 接下来,我们来说说赋值运算符
赋值运算符,其实最基本的就是等号(=),也就一个,但是变体就多了,和各种运算符组合在一起,就是不同的赋值运算符了。我来列举下常见的,大家瞧一瞧
+= ; -= , *=, /=, >>=, %=,等等。。。。太多
来个表达式,感受下 a+=b;这个读起来应该是a 加等b,其实是a = a + b;后面的以此类推。就不多解释了
来个例子,大家看看。
 
public class AssOperators{
		
	public static void main(String[] args){
		int var1 = 5;
		int var2 = 2;
		
		System.out.println("var1 += var2 的值是: " + (var1+=var2));
		System.out.println("var1 -= var2 的值是: " + (var1-=var2));
		System.out.println("var1 *= var2 的值是: " + (var1*=var2));
		System.out.println("var1 /= var2 的值是: " + (var1/=var2));
		System.out.println("var1 %= var2 的值是: " + (var1%=var2));
		System.out.println("var1 >>= var2 的值是: " + (var1>>=var2));
		
	}

}
   结果如下:
  
从零开始学java-(五)for ZCL:java运算符2_第5张图片
 
和你自己算的一样不?
哦了,来说说别的运算符吧,来看看三元运算符
三元运算符也叫三目运算符,为什么呢?因为他分为三部分,看个中文的表达式
布尔表达式?值0(true时的值);值1(false时的值)
这里的值0,值1不是说值是0或者1,而是布尔表达式的结果是true或者false时的值,0和1只是顺序符号而已没有特殊意义,来看例子
public class AssOperators{
		
	public static void main(String[] args){
		int var1 = 5;
		int var2 = 2;
		
		System.out.println("三元运算符的运算结果是: " + ( var1 > var2 ? "对咯!" : "错咯!" ));
		
		
	}

}
    猜猜var1大于var2是对了还是错了?
 
从零开始学java-(五)for ZCL:java运算符2_第6张图片
 现在知道三元运算符怎么用了吧,其实还是挺简单的
 最后再来说一个运算符,一个我们见过千百回的符号,()
叫做转型运算符,单独提及,是因为我们以后很多时候都要用到用到,不如说,我们知道低精度的数向高精度转换自动的,那么高精度向低精度转换不是自动的怎么办?这个时候就要用到我们的这个符号了
例如:double a = 20.5; int b = (int)a;
使用时括号放在需要转型的对象前面,括号中放置目标类型,来看看例子
 
public class ConvOperators{
		
	public static void main(String[] args){
		double varDouble = 20.51;
		int varInt = (int)varDouble;
		
		System.out.println("varInt的值是: " + varInt);
		
	}

}
 我们要打印的是int型,会不会四舍五入了?看看结果就知道了


  没有,转型的时候是丢失精度!!记住,是丢失
 
嘘。。运算符终于告一段落,运算符部分就打算写这么多,其他的有兴趣可以自行了解,找我也行。
本来还想说下这些运算符的优先级,不过鉴于有很多相关资料,就不多说了,大家可以自己学习,在实践中积累认知
   不知道大家注意没有,后面几篇我上传的java程序的格式是什么样的?为什么弄成这么样子,左对齐行不行啊?
思考下,下篇我们再来解答
 

你可能感兴趣的:(java)