-
-
2.位操作符
位操作符主要分为:与(AND)&、或(OR)|、异或(XOR)^、取反(NOT)~、移位操作符(<<,>>>,>>).
(1)与:&,两个输出位都为1,输出1
(2)或:|,任何一个输出位为1,输出1
(3)异或:^,两个输出位不同,输出1
(4)取反:~,输入为为1,输出0;输入位为0,输出1
(5)移位操作符
主要有三种:
左移运算:<<,左移一位相当于乘以2,将操作数向左移动,空出的低位用0补齐
有符号右移运算:>>,右移一位相当于除以2,将操作数向右移动,空出的高位是用0补齐还是1补齐要看原来移位之前的最高位是0还是1.如果移位之前最高位是0,则空出的高位全部补0,如果移位之前的最高位是1,则空出的高位全部补1
无符号右移运算:>>>,将操作数向右移动,空出的高位全部用0补齐,忽略正负
-
3.比较运算符
比较运算符可以对两个操作数进行比较,返回值为布尔型,即true或false。比较运算符主要分为6种:>、<、==、!=、<=、>=。比较操作符基本上只能用于比较基本数据类型,比较操作符比较的是数值的二进制,这里有个要注意的地方就是小数默认是以double的形式存的,如果是比较二进制的话0.3f==0.3,这个语句的返回值是false,因为0.3的二进制数是无穷无尽的
进制转换
0.3(十进制) = 0.0100110011001100(二进制)
超出计算精度,结果保留十六位小数
0.5(十进制) = 0.1(二进制)
而0.3f是float类型长度为32位,double为64位,0.3f的二进制与0.3的二进制不一样(精度被截断了),而0.5是可以除尽的,所以二进制是一样的。
程序验证:
0.3f与0.3的判断
当然,只有1除以2的n次方才会整除,所以以此来判断精度是不是会被截断。
比较操作符还有一点要注意的是==和!=(其他的不行!)是可以来判断引用类型是否相同的
字符的比较
图中s1和s2存在的是同一个地址里,s3是new了一个新的地址,所以比较其实是比较引用的地址是否相等,所以在比较的时候我们可以看到s1和s2的引用是相等的,s3与其他的引用是不同的地址。
-
4.逻辑操作符
主要有四种:与&、或|、短路与&&、短路或||。
&和&&:两个操作数都是true才会返回true
|和||:两个操作数只要有一个操作数是true就返回true
两个虽然大致的运算规则差不多,但是在运算的过程是大不一样的。
假设A1和A2,A1为false,A2位true,虽然A1&A2和A1&&A2的值都是返回false,但是在运算的过程中,A1&A2的时候,即使知道了,A1是false,还是会继续判断A2的值,而A1&&A2的时候,知道你A1是false的时候,就直接返回,不会判断A2的值,所以就成为短路与。同理||也是一样,要是A1为true,A2为false,那么判断的时候判断了A1为true之后,就不会再判断A2的值。所以写在if里面的判断的时候,一定要注意是否条件全部判断完,要根据情况,选择合适的逻辑操作符!
-