位运算
按位与 &
两个操作数,同为1则结果为1,否则为0。
例:
-10 & 8
10001010 (-10原)
11110110(-10补)
00001000(8补)
———————
00000000
注:
- 负数原码与补码相互转换的简便规则为:从右向左找到第一个1,将其左边的数值位全部取反,右边的保持不变,符号位不变。
- 运算操作要用补码
按位或 |
两个操作数,同为0则结果为0,否则为1。
例:
-12 | -10
10001100(-12原码) 10001010(-10原码)
11110100(-12补码)
11110110(-10补码)
——————————
111101110(补码)
10001010(原码)
结果为-10
按位取反 ~
所有位都取反
异或运算 ^
两个操作数,相同为0,不同为1。
移位运算
左移
右边空出来的位用0填补,最高位左移溢出则舍弃该高位
左移几位其实就是这个数 *2的几次幂
有符号右移 >>
左边空出来的位用0或1填补,整数用0负数用1填补。
右移几位其实就是这个数 /2的几次幂 ---->除法
重点面试题:
用最快速度计算出2*16的值
public class yiwei {
public static void main(String[] args){
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");
}
}
运行结果:
可以看出,移位运算的速度更快