数值类型的运算方式总结

一、常见的位运算使用场景

        在计算机中,整数以二进制的形式表示

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

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值