1.位运算
处理数据类型的时候,可以直接对组成整形数值的各个位完成操作
&("and") |("or") ~("not") ^("xor”)
------------------------------------------------------------------------------
以下用例皆为byte类型:
①:按位与操作
两个操作数,如果同为1则为1,否则为0
例题:
-10 原码:10001010
反码:11110101
补码:11110110
8 00001000
11110110
00001000
& 00000000
②:按位或操作
只有两个操作数对应位同为0时,结果为0,其余全为1.
例题:
-10 原码:10001010
反码:11110101
补码:11110110
8 00001000
11110110
00001000
| 11111110
③:~:按位取反
所有位均取反,0改为1,1改为0
④:按位异或操作
两个操作数对应位,相同则结果为0,不同则结果为1
例题:
-10
原码:10001010
反码:11110101
补码:11110110
8
原码:00001000
11110110
00001000
^ 11111110
2.移位运算
以下用例皆为byte类型:
①:左移(<<)
右边空出来的位用0填补高位左移溢出则舍弃该高位
左移几位其实就是这个数 *2 的几次幂li
例题:-8<<2
-8
原码:10001000
反码:11110111
补码:11111000
-8<<2
补码:11100000
反码:11011111
原码:10100000=-32
-8*(2^2)=8*4=32
②:右移(>>)
左边空出来的位用0或1填补,正数用0负数用1填补。
右移几位其实就是这个数/2的几次幂 -----》除法
例题:
-8
原码:10001000
补码:11111000
-8>>2
整数补0,负数补1,所以此处补1
补码:11111110
原码:10000010=-2
-8/(2^2)=-2
③:无符号右移(>>>)
数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补
总结:左移右移其实操作的都是2的倍数
重点面试题:
用最快速度计算出2*16的值
public static void main(String[] args) {
//用最快的速度计算出2*8
long startTime=System.nanoTime(); //获取开始时间
System.out.println(2*16);
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
long startTime1=System.nanoTime(); //获取开始时间
System.out.println(2<<4);
long endTime1=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns");
}
运行结果:
32
程序运行时间: 118700ns
32
程序运行时间: 13200ns