- 常见位运算使用场景
- 整数类型运算时的类型溢出问题,产生原因以及解决办法
- 浮点类型运算时的精度丢失问题,产生原因以及解决办法
位运算 常见使用场景
位运算符 | 运算规则 |
^ | 相同为0,不同为1 |
& | 同时为1,结果为1,否则为0 |
| | 同时为0,结果为0,否则为1 |
~ | 对二进制每一位取反,1变0,0变1 |
<< | 左移变大 |
>> | 右移变小 |
判断奇偶数
一个数与1做&运算,结果为1是奇数,结果为0是偶数
public class Demo1 {
public static void main(String[] args) {
//位运算:&运算
//运算规则: 同时1,结果为1,否则为0
int number = 1317;
//偶数:二进制的最低位是0
//奇数:二进制的最低位是1
System.out.println(number & 1);
}
}
输出结果:
1
交换两个变量
给出两个数使用^交换两个数,可用于交换下标
public class Demo2 {
public static void main(String[] args) {
int a = 5,b = 6;
a = a^b;
b = b^a;
a = a^b;
System.out.println(a);
System.out.println(b);
}
}
输出结果:
6
5
找出没有重复的数
只有1个数字出现1次,其余数字均出现2次(偶数次)
public class Demo3 {
public static void main(String[] args) {
//只有1个数字出现1次,其余数字均出现2次(偶数次)
int [] numbers = {1,2,3,4,9,3,1,4,2};
int ret = 0;//1^2^3^4^9^3^1^4^2
for(int i = 0;i<numbers.length;i++) {
ret = ret ^ numbers[i];
}
System.out.println(ret);
}
}
输出结果:
9
哈希值计算数组下标
减少哈希冲突
通过key的hashCode()方法返回的哈希值与它的高16位进行异或运算且数组长度是2的次幂
作用:计算出的hash值,在计算下标位置时,会更“散列”,减少哈希冲突
替代乘法和除法可以加速算法的实现
相比较算数运算符,位运算的性能和效率更高
public class Demo4 {
public static void main(String[] args) {
//位运算:<< >> 位移运算
//直接在当前数字的二进制位基础上运算
//相比较算数运算符,位运算的性能和效率更高
int number = 99;
System.out.println(number << 3);//向左移3位相当于n*2^3
System.out.println(number >> 3);//向右移3位相当于n/2^3
//在原有cap变量基础上,计算1.5倍的增长
int cap = 9;
int newCap1 = (int)(cap*1.5);//算数运算符
int newCap2 = cap + (cap >> 1);//位运算
System.out.println(newCap1);
System.out.println(newCap1);
}
}
输出结果:
792
12
13
13
整数类型运算时的类型溢出问题,产生原因以及解决办法
Java中的类型都是有符号的,最高位表示符号位,且都有取值范围
类型 | 占用bit位 | 取值范围 |
byte | 8 | -2^7~2^7-1 |
short | 16 | -2^15~2^15-1 |
int | 32 | -2^31~2^31-1 |
long | 64 | -2^63~2^63-1 |
产生原因:
- 算术运算:在加法、减法、乘法和除法等算术运算中,如果结果超出了整数类型的范围,就会发生溢出。
- 类型转换:当将一个大范围的整数转换为一个较小范围的整数类型时,如果原始值超出了目标类型的表示范围,就会发生溢出。
解决办法:
- 检查范围:在进行整数运算之前,可以检查参与运算的数值是否在所用数据类型的表示范围内,避免溢出。
- 使用更大范围的数据类型:如果预计结果可能超出当前数据类型的范围,可以选择使用更大范围的整数类型,例如使用64位整数代替32位整数。
- 使用大型整数:BigInteger进行计算。
浮点类型运算时的精度丢失问题,产生原因以及解决办法
产生原因:
- 因为计算机内部是通过二进制形式来保存浮点数的,无法精确的表示十进制的小数,会产生精度丢失。十进制在转换为二进制时,小数部分会乘2取整,在乘2取整过程中会产生无限循环的情况。
- 浮点数表示的有限精度:计算机中使用有限的位数来表示浮点数,例如单精度浮点数(32位)和双精度浮点数(64位),这会导致在表示大范围或小范围的数值时出现精度损失。
解决办法:
- 使用更高精度的数据类型:如果需要更高的精度,可以使用高精度数值类型使用BigDecimal
- 注意数值范围:进行浮点数计算时注意数值范围,避免超出表示范围导致的精度丢失问题。