Java-数值类型的运算方式总结

文章探讨了位运算在编程中的常见应用场景,包括奇偶数判断、变量交换、哈希值计算等。重点介绍了整数类型运算中的溢出问题及解决策略,以及浮点类型运算时的精度丢失原因和应对方法,提到了使用BigInteger处理大范围整数计算的需求。
摘要由CSDN通过智能技术生成
  1. 常见位运算使用场景
  2. 整数类型运算时的类型溢出问题,产生原因以及解决办法
  3. 浮点类型运算时的精度丢失问题,产生原因以及解决办法

位运算 常见使用场景

位运算符运算规则
^相同为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位取值范围
byte8-2^7~2^7-1
short16-2^15~2^15-1
int32-2^31~2^31-1
long64-2^63~2^63-1

 产生原因:

  1. 算术运算:在加法、减法、乘法和除法等算术运算中,如果结果超出了整数类型的范围,就会发生溢出。
  2. 类型转换:当将一个大范围的整数转换为一个较小范围的整数类型时,如果原始值超出了目标类型的表示范围,就会发生溢出。

 解决办法:

  1. 检查范围:在进行整数运算之前,可以检查参与运算的数值是否在所用数据类型的表示范围内,避免溢出。
  2. 使用更大范围的数据类型:如果预计结果可能超出当前数据类型的范围,可以选择使用更大范围的整数类型,例如使用64位整数代替32位整数。
  3. 使用大型整数:BigInteger进行计算。

 浮点类型运算时的精度丢失问题,产生原因以及解决办法

 产生原因:

  1. 因为计算机内部是通过二进制形式来保存浮点数的,无法精确的表示十进制的小数,会产生精度丢失。十进制在转换为二进制时,小数部分会乘2取整,在乘2取整过程中会产生无限循环的情况。
  2. 浮点数表示的有限精度:计算机中使用有限的位数来表示浮点数,例如单精度浮点数(32位)和双精度浮点数(64位),这会导致在表示大范围或小范围的数值时出现精度损失。

 解决办法:

  1. 使用更高精度的数据类型:如果需要更高的精度,可以使用高精度数值类型使用BigDecimal
  2. 注意数值范围:进行浮点数计算时注意数值范围,避免超出表示范围导致的精度丢失问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值