可用运算符
值的运算也是自定义的,但是这个就看不出了。
要么翻源文件,要么翻说明书才知道一个类型能怎么运算。
但是一个默认情况下的类型,是没有定义任何运算符的。
也就是说你适用的运算一定是由人先写出来的,没有系统默认的。
这一章为后续的自定义运算符做铺垫,运算符是不能想选什么符号就用什么符号的。
这一章先一览常见的运算符。
一元运算符
一元运算符只需要一个值就能进行计算
负数
在操作数前面可以适用+号或 - 号。直接含义是表示这个数字的本身,和他的负数。
取反
符号~和!都表示取相反的值。
在官方的定义里~被用于整数(小数类型不可用),!用于bool
数字的储存,是按照10101010这样的方式储存的,
对他适用~,会把每个数字全部取反,变成01010101。
二元运算
数学运算
数学运算符共有5种
分别是加,减,乘,除,和求余。
int a = 1 + 1;
int b = 1 - 1;
int c = 1 * 1;
int d = 1 / 1;
int e = 1 % 1;//求余数适用%符号
逻辑运算
逻辑运算除了上面说过的取反,
还有位与,逻辑与,位或,逻辑或,异或
bool t = true;
bool f = false;
bool b1 = t | f;//位或
bool b2 = t || f;//逻辑或
bool b3 = t & f;//位与
bool b4 = t && f;//逻辑与
bool b5 = t ^ f;//异或
什么是与,或,异或
与是指需要所有条件都满足。
与就是和的意思,这场比赛小明和小王都必须到场,就是缺一不可。
或是指条件有一个满足。
这场比赛小明和小王有任何一个人来就行了。
异或,条件有不一样的。
这场比赛,要么小明在红队小王在蓝队;要么小明在蓝队小王在红队。
总之他们不能在一个队伍里。
逻辑和或的区别
- 位可以对数字使用。和取反一样,对这个数字上的所有01进行或运算,或与运算。
- 逻辑运算会短路。如果左边的值已经能得到结果了,就不会再执行右边的值了。
例如,整数的0不能用来当除数。
b6在计算的时候,左侧直接能得到值,不会计算1/0,所以不会出错。
而b7会执行到1/0。
int i = 0;
bool b6 = true || 1 / i > 0;
bool b7 = true | i / i > 0;
位偏移
位偏移一共有三种符号。左偏移,右偏移,不带符号右偏移。
int i1 = 1 >>> 2;
int i2 = 1 << 2;
int i3 = 1 >> 2;
对于一个二进制的数字00010100来说,
左偏移两位就会变成:01010000。从结果来说就是值除4.
右偏移同理,偏移三位相当于乘8。
而无符号右偏移,会保留符号位,也就是第一位数字不动。
偏移的作用很小。他的作用就是给算法工程师做优化。
直接偏移的效率是比算乘法除法要快的。
关系运算
关系运算有6种。分别是大于,小于,大于等于,小于等于,等于,不等于。
int i1 = 10, i2 = 10;
bool b1 = i1 < i2;
bool b2 = i1 <= i2;
bool b3 = i1 > i2;
bool b4 = i1 >= i2;
bool b5 = i1 == i2;
bool b6 = i1 != i2;
需要强调的是他的顺序。等于号一定是写在右边的。
另外,等于运算需要写两个等于。一个等于只用来表示赋值运算。