数值类型的运算方式总结

一、常见的位运算

1.移位运算(<<,>>)

>>相当于某个整数的50%(右)

<<相当于某个整数的1倍(左)

//计算50%或者2倍
int size = 10;
System.out.println(size << 1);//20
System.out.println(size >> 1);//5

2.与运算(&) 

&运算规则:必须两个数同时为1,结果才为1

		//判断奇偶数
		int number = 11;
		System.out.println(number & 1);//等于1,代表奇数
		System.out.println((number & 1) == 0);//等于0,代表偶数
		System.out.println((number & 1) == 1);//等于1,代表奇数
		System.out.println("----------------------------------------");

3.或运算(|) 

|运算规则:只要任意一个为1,结果就为1

int i = 167776589;//1010 0000 0000 0001 0001 0100 1101
int n = 167776512;//1010 0000 0000 0001 0001 0000 0000
int x = i | n;
system.out.println(x);//167776589

4.非运算(~) 

~运算规则:0和1交换(反转)

int i = 167776589;//1010 0000 0000 0001 0001 0100 1101
int n = ~ i;//0101 1111 1111 1110 1110 1011 0010
system.out.prinln(n);

5.异或运算(^) 

^运算规则:如果两个数不同,结果为1,否则为0

//交换两个变量的值
		int a = 4,b = 18;
		
		//方法1:使用中间变量
//		int temp = a;
//		a = b;
//		b = temp;
//		System.out.println("a =" + a);
//		System.out.println("b =" + b);
//		System.out.println("----------------------------------------");

		//方法二:采用异或位运算
//		a = a ^ b;
//		b = a ^ b;
//		a = a ^ b;
		
		//作用等同于
		a ^= b;
		b ^= a;
		a ^= b;
		
		System.out.println("a =" + a);
		System.out.println("b =" + b);
	}

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

1.移位运算(<<\>>):左移\右移
  • 计算指定值n的50% : n>>1
  • 计算指定值n的2倍 : n<<1
2.与运算(&): 判断奇偶数
  • a&0 == 0 偶数
  • a&0 == 1 奇数
3.异或运算(^): 交换两个整数
4.求平均值,防止溢出
  • (x&y)+((x^y)>>1)

三、整数类型运算时的类型溢出问题,产生原因以及解决办法

1.产生溢出的原因

因为整数存在范围限制,如果计算结果超出范围,就会产生溢出;

注:溢出不会报错,会得到一个奇怪的结果

2.溢出包括编译溢出和运行结果溢出

  • 编译溢出

  • 运行结果溢出


注:结果为负数原因==>由于最高位计算结果为1,因此,加法结果变成负数


3.解决溢出方法

  • 将整型转换为长整型long(不常用)

注:只能暂时解决少数数字不是很大的整数溢出问题)

  • 超大整数 BigInteger(常用)------- 解决"超大整数"

    package com.apesourse.demo;
    
    import java.math.BigInteger;
    
    public class Demo01 {
    	public static void main(String[] args) {
    		// 整数类型溢出
    //		int n1=2147483647,n2=2147483647;
    //		System.out.println(n1 + n2);//-2
    		//使用
    		BigInteger n1=new BigInteger("24235245233698741");
    		BigInteger n2=new BigInteger("24235245233698741");
    		
    		//通过调用方法,进行加减乘除运算
    		//加法
    		BigInteger sum=n1.add(n2);//n1+n2
    		System.out.println(sum);//48470490467397482
    //		//减法
    		BigInteger sub=n1.subtract(n2);//n1-n2
    		System.out.println(sub);//0
    //		//乘法
    		BigInteger mul=n1.multiply(n2);//n1*n2
    		System.out.println(mul);//587347111537517543268191544985081
    //		//除法
    		BigInteger div=n1.divide(n2);//n1÷n2
    		System.out.println(div);//1
    		
    //		//混合运算:n1*n2+n3
    		BigInteger n3=new BigInteger("1000");
    		BigInteger ret=n2.multiply(n3).add(n1);
    		System.out.println(ret);//24259480478932439741
    		
    	}
     
    }

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

 1.浮点数精度丢失原因

浮点数不像整数可以进行位运算和移位运算。浮点数由整数和小数组成,而计算机使用的是二进存储,对于某些小数,可能无法用二进制进行准确表述。从而导致无限循环或是溢出到更大的基数,最终超出范围,从而精度丢失。

2.解决精度丢失方法

  • BigDeciaml --------- 解决"超大浮点数"

    package com.apesourse.demo02;
    
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    //BigDecimal
    //解决问题:浮点数计算时,精度丢失的问题;超大浮点数保存;
    public class Demo06 {
    	public static void main(String[] args) {
    		double d1 = 0.2;
    		double d2 = 0.3;
    		System.out.println(d1 + d2);//0.5
    		System.out.println(d1 - d2);//-0.09999999999999998
    		System.out.println(d1 * d2);//0.06
    		System.out.println(d1 / d2);//0.6666666666666667
    		
    		System.out.println("----------------------------------------------------");
    		//超大浮点数加减乘
    		BigDecimal dec1 = new BigDecimal("0.2");
    		BigDecimal dec2 = new BigDecimal("0.3");
    		System.out.println(dec1.add(dec2));//0.5
    		System.out.println(dec1.subtract(dec2));//-0.1
    		System.out.println(dec1.multiply(dec2));//0.06
    		//除法:除不尽的情况
    		//ArithmeticException算术逻辑异常
    //		System.out.println(dec1.divide(dec2)); 
    		
    		//保留10位小数,并设置模式
    		System.out.printf("%f÷%f = %f\n",dec1,dec2,dec1.divide(dec2,10,RoundingMode.HALF_UP));
    		
    		//除法+取余
    		BigDecimal[] results = dec1.divideAndRemainder(dec2);
    		System.out.println("商:"+results[0]);
    		System.out.println("余:"+results[1]);
    		
    	}
    
    }
    

注:只有整数运算才可以进行位运算(特例:字符型char也可以) ,浮点数不可以 !!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值