1.位运算
处理数据类型的时候,可以直接对组成整型数值的各个位完成操作
&("and") |("or") ~("not") ^("xor”)
------------------------------------------------------------------------------
以下用例皆为byte类型:
①:按位与操作
两个操作数,如果同为1则为1,否则为0
例题:
-10 & 8: 00000000
②:按位或操作
只有两个操作数对应位同为0时,结果为0,其余全为1.
例题:
-10 | 8:11111110
③:~:按位取反
④:按位亦或操作
两个操作数对应位,相同则结果为0,不同则结果为1
例题:
-10 ^ 8:11111110
学到这里,我想你也可能会问,位运算到底有什么用途或者有哪些场景可以应用到它。因为位运算的运算效率比直接对数字进行加减乘除高很多,所以当出现以下情景且对运算效率要求较高时,可以考虑使用位运算。不过实际工作中,很少用到它,我也不知道为什么很少有人用它,我想应该是它比较晦涩难懂,如果用它来进行一些运算,估计编写的代码的可读性会不强,毕竟我们写的代码不仅仅留给自己一个人看。
1. 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
2. 求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
(x&y)+((x^y)>>1);
3. 对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
4. 比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
x ^= y;
y ^= x;
x ^= y;
5. 求绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n - 1)
7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a
8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
9. 求相反数
(~x+1)
10 a % 2 等价于 a & 1
2.移位运算
以下用例皆为byte类型:
①:左移(
右边空出来的位用0填补高位左移溢出则舍弃该高位
左移几位其实就是这个数 *2 的几次幂
②:有符号右移(>>)
左边空出来的位用0或1填补,正数用0负数用1填补。
右移几位其实就是这个数/2的几次幂 -----》除法
数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补
注意:整型默认是使用int,所以计算无符号右移时,是按照32位二进制数进行计算的
重点面试题:
用最快速度计算出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");
}
答案