Java位运算符

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

Java源码中比较常见的是移位运算符

一些比较使用的位运算技巧

//取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);
  • 使用位运算时注意优先级问题
  • 注意溢出问题
posted @ 2019-09-25 10:25  千里暮雲平  阅读(368)  评论(0编辑  收藏  举报