Java位运算符
位运算符
在计算机中所有的数据都是以二进制进行存储的,对二进制的进行的运算都称为位运算,一般而言,乘法位运算会比乘法较快一点。
Java中的位运算
~ | 位非(NOT) | 反转操作数的比特位,即0变成1,1变成0。 | 对任一数值 x 进行按位非操作的结果为 -(x + 1) |
& | 位与(AND) | 对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。 | |
| | 位或(OR) | 对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0 | |
^ | 位异或(XOR) | 对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。 | |
>> | 右移 | 向右移动指定位数,最高位由符号位补 | |
>>> | 右移,左边空出以0填充 | 向右移动指定位数,左边补0 | |
<< | 左移 | 向左移动指定位数,高位丢弃,低位补0 |
一些比较使用的位运算技巧
//取int最大值
int i = (1 << 31) - 1;
int j = ~(1 << 31);
//取int最小值
int k = 1 << 31;
int l = 1 << -1;
//取反
int a = 22;
int b = ~a + 1;
//乘以2的n次方
int p = 22 << 3;
//除于2的n次方
int u = 16 >> 3;
//判断奇偶
boolean boo = (11 & 1) == 1;
//计算2的n次方 n > 0
int h = 2<<(4-1);
//判断一个数n是不是2的幂
boolean bool = (16 & (16 - 1)) == 0;
//交换两数,前提是两数不能相同,否则为0
a ^= b;
b ^= a;
a ^= b;
注意:
- 位运算只能对整数进行操作,直接对浮点数进行操作会报错,需要转换成bits类型,计算完成后再转换回来
long u = Double.doubleToLongBits(16.0) >> 3;
double v = Double.longBitsToDouble(u);
- 使用位运算时注意优先级问题
- 注意溢出问题