提纲1:常见的位运算使用场景
提纲2:整数类型运算时的类型溢出问题,产生原因以及解决办法
提纲3:浮点类型运算时的精度丢失问题,产生原因以及解决办法
数值类型(6种)分为:
整型(整数):byte 字节型,占1个字节 short 短整型,占2个字节 int 整型, 占4个字节(默认)
long 长整型,占8个字节
浮点型(小数):float 单精度浮点数,占4个字节 double 双精度浮点数,占8个字节(默认)
运算方式:
1.算术运算符:+ - * / %
注意1:数值类型使用算术运算符,运算结果任然为数值
注意2:整数之间使用“\”,进行整除运算
注意3:整数不能为“零”
注意4:防止“类型溢出”
整数类型运算时的类型溢出问题,产生原因以及解决办法
产生原因:
固定范围:Java的整数类型有固定的范围。例如,int类型的范围是-2^31到2^31-1(包括负数,因为Java使用二进制补码表示法)。如果运算结果超出这个范围,就会发生溢出。
算术运算:任何可能产生超出范围结果的算术运算(加法、减法、乘法)都可能导致溢出。
类型转换:将一个范围较大的整数类型强制转换为范围较小的整数类型时,如果值超出目标类型的范围,也会发生溢出。解决办法:
整数类型运算时遇到的类型溢出问题,可以使用BigInteger来解决
浮点类型运算时的精度丢失问题,产生原因以及解决办法
产生原因:
是因为计算机内部是通过二进制形式来保存浮点数的,无法精确的表示十进制的小数,所以会产生精度丢失的问题。具体情况如下:
十进制的小数在进行二进制转换时,整数部分会除二取余,小数部分会乘二取整,在乘二取整的过程中,会产生无限循环的情况,所以就出现了精度丢失。解决办法:
浮点类型运算时遇到的精度丢失问题,可以使用BigDecimal来解决
注意5:浮点数运算时,除数为零
System.out.println(-5.0/0); //结果为Infinity或-InfinitySystem.out.println(0.0/0); //结果为NaN
2.位运算:
1)<< (左移)>> (右移)位移运算:左移变大,右移变小
int number=100;
System.out.println(number<<3);//向左移3位相当于n*2^3
System.out.println(number>>3);//向右移3位相当于n/2^3//在原有基础上,计算1.5 倍的增长
int cap=16;
int newCap1=(int)(cap*1.5);//算术运算符
int newCap2=cap+(cap>>1);//位运算符
System.out.println(newCap1);
System.out.println(newCap2);
2)位运算:&运算
运算规则:同时为1 结果为1 否则为0
常见的位运算使用场景:
1.判断奇偶数:位运算可以用于判断一个整数是奇数还是偶数。一个整数与1进行位与运算,如果结果为0,则该整数为偶数;如果结果为1,则该整数为奇数
2.快速的计算:位运算可以用于实现一些简单的乘法和除法运算。例如,乘以2可以通过左移一位来实现,除以2可以通过右移一位来实现。
3.哈希值的计算:在哈希算法中,位运算也经常被使用。例如,Java的HashMap在实现其hash方法时,就使用了右移运算符(>>>)。
4.交换变量值:位运算可以用于交换两个变量的值。你可以使用异或(^)运算和位与(&)运算来实现这一点。
lass demo02 {public static void main(String[] args) {int a = 5;int b = 10;System.out.println("交换前:");System.out.println("a = " + a);System.out.println("b = " + b);// 使用异或运算交换a和b的值a = a ^ b;b = a ^ b;a = a ^ b;System.out.println("交换后:");System.out.println("a = " + a);System.out.println("b = " + b);}}运行结果: 交换前: a = 5 b = 10 交换后: a = 10 b = 5
3.关系运算符:> < >= <= == !=
运算规则:数值类型之间运算,运算结果为boolean
4.逻辑运算符:&&(与) || (或) !(非)
运算规则:布尔类型之间运算,结果为boolean
&&运算:同时为true 结果为true 否则为false
||运算:同时为false 结果为false 否则为true
!运算:false为true true为false
5.三元运算符:条件表达式?表达式1:表达式2
int a=7 ,b=13 ,c=91;//3个变量排序//最大值int max=(a>b) ? (a>c ? a : c) :(b>c ? b : c);//最小值int min=(a<b) ? (a<c ? a : c) :(b<c ? b : c);//中间值int mid=(a+b+c)-max-min;System.out.println(max);System.out.println(mid);System.out.println(min);