一、常见的位运算使用场景
在计算机中,整数以二进制的形式表示
1.移位运算<<或>>
<<(左移):n×2的位移数次方(乘法)
注意:
>>(右移):n÷2的位移数次方(除法)
int n=8;//1000
//左移1位:8×2的1次方
int a=8<<1;//16
//左移2位:8×2的2次方
int b=8<<2;//32
//左移28位:8×2的28次方
int c=8<<28;//-2147483648
//右移1位:8÷2的1次方
int d=8>>1;//4
//右移2位:8÷2的2次方
int f=8>>2;//2
2.与运算&
必须两个数同时为1,结果才为1
int x=23265;//101101011100001
int y=32975;//1000000011001111
//两个数同时为1,结果为1
int a=x&y;//11000001
System.out.println(a);//193
3.或运算|
只要任意一个为1,结果就为1
int x=23265;//101101011100001
int y=32975;//1000000011001111
//只要任意一个为1,结果就为1
int a=x|y;//1101101011101111
System.out.println(a);//56047
4.非运算~
0和1互换
int x=23265;//101101011100001
int a=~x;//11111111111111111010010100011110
System.out.println(a);//-23266
5.异或运算^
如果两个数不同,结果为1,否则为0
int x=23265;
int y=32975;
int a=x^y;//1101101000101110
System.out.println(a);//55854
二、整数类型运算的类型溢出问题
1.产生原因
由于整数存在范围限制(例如int型:-2147483648 ~ +2147483647),如果计算结果超出了范围,就会产生溢出,但不会出现错误,只会产生一个奇怪的结果。
int a=2147483640+15;
//正确结果:2147483655
//产生溢出
System.out.println(a);//实际输出结果:-2147483641
2.解决方法
方法1:可以将int类型转换成long类型,long类型表示整型的范围更广
方法2:采用BigInteger来表示任意大小的整数。其也是一个类,故要创建实例。但运算不采用四则运算。
//方法1:
long x=2147483640;
long y=15;
System.out.println(x+y);//2147483655
//方法2:
BigInteger a=new BigInteger("2147483640");
BigInteger b=new BigInteger("1652");
System.out.println("加法:"+a.add(b));
System.out.println("减法:"+a.subtract(b));
System.out.println("乘法:"+a.multiply(b));
System.out.println("除法:"+a.compareTo(b));
三、浮点类型运算的精度丢失问题
1.产生原因
计算机计算时通常会将数据转换成二进制,而浮点数的小数位转换成二进制时,每次乘以二,会形成无限循环小数,计算机会自动将它转换为近似值,这时就会形成精度丢失。
double a=10-9.9;
//正确结果:0.1
System.out.println(a);//实际输出结果:0.09999999999999964
//产生精度丢失
2.解决方法
采用BigDecimal解决,表示一个任意大小且精度完全准确的浮点数。对BigDecimal进行加减乘除都不会存在精度丢失问题,但除法会出现无法除尽的情况,此时必须指定精度以及如何截断。
BigDecimal b=new BigDecimal("10");
BigDecimal c=new BigDecimal("9.9");
System.out.println(b.subtract(c));//0.1