1.加减乘除
整数型在做运算时,如果两个数都没有被fianl修饰,将自动转换成int类型做运算,结果也要用int来接收
向上提升:double d= 4>4 ? 99.9 : 9 如果取值的两个数都是基本类型,结果将自动转换成大的那个类型,d=9.0
优先级
先计算乘除后加减
如果运算优先级相同,从左向右
如果需要手动改变优先级使用(), ()可以嵌套使用
除法运算时,如果除数是0,会发生异常
% 取余
例如,10%3得到的结果是1,
三目运算符
String sex= 1>1? “n”:“y”; 最终sex的结果是y
逻辑运算
== 基本类型,比较的是值,引用类型比较的是地址
& 并且 &&效率更快
| 或者 ||效率更快
!= 取反
位运算
计算机系统中,数字一律用补码来表示、运算、存储
位运算起源于C语言的低级操作,因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销,逻辑运算也属于位运算,只不过其是进行判断,比如 &与,两者都为1,结果才为1
原码反码补码
原码:原码表示法在数字前面增加了一位符号位,即最高位为符号位,正数位该位为0,负数位该位为1,比如byte类型的5如果用二进制位来表示就是00000101,-5就是10000101
反码:正数的反码是其本身,负数的反码在其原码的基础上,符号位不变,其余各个位取反。5的反码就是00000101,而-5的则为11111010
补码:正数的补码是其本身,负数的补码在反码的基础上+1。5的反码就是00000101,而-5的则为11111011。
<<左移运算
规则:二进制补码后,全部向左移动1位,高位丢掉,低位自动补0
计算2<<1
2的所有二进制位向左移动1位,高位丢掉,低位自动补0,00000010 变成了00000010**0,**结果为4
一个数字向左移动1位相当于这个数本身乘以一次2,向左移动2位就相当乘以两次2,左移运算数值会越来越大
>>右移运算
转为二进制补码后,各二进制位全部右移N位,如果要进行运算的这个数是正数,则在高位插入 0,是负数,则在高位插入1
计算10>>2
10的二进制补码向右移动两位,00001010,10是正数,低位丢弃2个,高位自动补0,变成了00000010,结果为2
计算-7>>2
7的二进制是00000111,-7是100000111,反码111111000,补码111111001
111111001向右移动2位,-7是负数,高位不够补1,变成了 111111110,转成反码111111101,转成原码100000010,结果为-2
由于右移运算的特性,正数高位补0,负数补1,一个正数右移动的位数大于它本身的二进制补码位时,结果总是0,一个负数右移动的位数大于它本身的位时结果总是-1,所有有了无符号右移运算(>>>)
>>>无符号右移运算
规则:转为二进制后,各二进制位全部右移N位,无论正负,都在高位插入0
计算10>>>2
10的二进制补码向右移动两位,00001010,10是正数,低位丢弃2个,高位自动补0,变成了00000010,结果为2
计算-6>>>1
原码00000000000000000000000000000110,反码11111111111111111111111111111001
补码11111111111111111111111111111010,右移1位,并在高位补0
0111111111111111111111111111101,转成反码01111111111111111111111111111100,
转成原码10000000000000000000000000000011,结果是2147483651,int最大值是2147483647,溢出
2.逻辑符的位运算
逻辑符如果直接和某个数进行运算,将会按照这个数的二进制做计算,然后生成新的数
以逻辑符 | 举例
@Test
public void random(){
System.out.println(87|55);//结果为119
}
按照|的描述,将两个数转换2进制后做比较