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);
  • 使用位运算时注意优先级问题
  • 注意溢出问题
02-14 02:50