1. 位运算的定义
Java位运算是对操作数的二进制位进行运算,操作数和计算结果都是整型。Java位运算有以下几种类型:&与,|或,^异或,~取反,<<左移,>>右移,>>>无符号右移。
2.Java位运算的场景
Java位运算的场景有很多,比如:
- 判断奇偶数:a & 1 == 0 表示a是偶数,a & 1 == 1 表示a是奇数。
- 求绝对值:(a ^ (a >> 31)) - (a >> 31) 可以得到a的绝对值。
- 求相反数:~a + 1 可以得到a的相反数。
- 交换两个数:a = a ^ b; b = a ^ b; a = a ^ b; 可以交换a和b的值。
- 权限控制:用一个int型变量表示32种权限,每一位代表一种权限,用|或运算设置权限,用&与运算检查权限
3.JDK中哪些地方用到了位运算
JDK中有很多地方用到了位运算,比如:
- HashMap的hash方法用到了无符号右移运算符>>>1。
- Integer的numberOfLeadingZeros方法用到了异或运算符^和右移运算符>>1。
- BitSet的set和get方法用到了与运算符&和或运算符|1。
- EnumSet的of方法用到了左移运算符<<1。
- Thread的getState方法用到了位域和联合的方式来表示线程状态
4.位运算的优缺点
位运算的优点是:
- 位运算是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高。
- 位运算可以实现一些简单的乘除法,比如乘2或除2,只需左移或右移一位即可。
- 位运算可以用来进行权限控制,加密解密,压缩解压等操作。
位运算的缺点是:
- 位运算的可读性较差,不易理解和调试。
- 位运算的适用范围有限,只能对整数进行操作,不能对浮点数或字符串等类型进行操作。
- 位运算需要注意一些细节,比如符号位,溢出,补码等.