数值类型的运算方式总结

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

(1)、与运算(&)

采用与运算(&):当一个整数和1与运算,结果为1则是奇数,结果为0则是偶数

判断一个整数奇偶性:

public class Demo01 {
	public static void main(String[] args) {
		int n=13;
		String ret=(n&1)==1?"奇数":"偶数";
		System.out.println(ret);
	}

}

运行结果:

(2)、或运算(|)

或运算:两个二进制对应位上的数字有一个为1时,结果位上的数字就为1;

用途:主要用于设置某些二进制位为1

例子:

3 | 5 =7

3的二进制表示:0011

7的二进制表示:0101

0 | 0=0

0 | 1=1

1 | 0=1

1 | 1=1

所以:3 | 5=0011 | 0101 = 0111 = 7

public class Demo01 {
	public static void main(String[] args) {
		int a=63;//0011 1111
		int b=15;//0000 1111
		int c=a | b;//0011 1111
		System.out.println(c);//63

        int n=10;
		n |= 1;//将n的最后一位设置为1,变成奇数
		System.out.println(n);//11
		
	}
}

(3)、异或运算(^)

采用异或运算(^):真真为真,假假为假,真假为真,两个数字异或相同为0,不同为1

通过异或还可以进行数字交换

判断出现一次的数字:(运行结果为4)

public class Demo01 {
	public static void main(String[] args) {
		int ret=1^3^2^7^4^7^1^2^3;
		System.out.println(ret);
	}
}

数字交换:(运行结果:a=11,b=2)

public class Demo01 {
	public static void main(String[] args) {
		int a=2;
		int b=11;
		a=a^b;
		b=a^b;
		a=a^b;
		System.out.println("a="+a);
		System.out.println("b="+b);
		
	}
}

(4)、取反(~)

对二进制的每一位都取反,1取反为0,0取反为1,

取反运算将每一位都取反,正数取反为负数,负数取反为正数,用取反运算可以计算相反数即+1

(5)、左移运算(<<)

二进制整数整体左移n位,低位补0,左移n位相当于将一个数乘以2的n次方

(6)、右移运算(>>)

二进制整数整体右移n位,正数高位补0,负数高位补1,右移n位相当于将一个数除以2的n次方并取整

二、整数类型运算时的类型溢出

产生原因:

整数类型在内存中保存在一个固定长度的空间,它能存储的最大值和最小值是固定的,如果我们存储的值大于或小于它的范围,则产生整数溢出,产生一个非正常数值

解决办法:

(1)强制类型转换 int——>long

(2)使用BigInteger来保存超大整数

三、浮点数经度丢失问题

产生原因:

计算机底层在对数据表示时通常采用二进制表示,而浮点数十进制值通常没有完全精确的二进制表示,且数字之间类型不匹配(混合使用浮点数和双精度数)就容易造成一些精度丢失的问题

解决办法:

使用BigDecimal来进行精确计算,通过调用BigDecimal的加(add)、减(subtract)、乘(multiply)、除(divide)等方法来进行计算

import java.math.BigDecimal;

public class Demo01 {
	public static void main(String[] args) {
		BigDecimal b1=new BigDecimal("123.211");
		BigDecimal b2=new BigDecimal("29.327");
		BigDecimal ret=b1.add(b2);
		System.out.println("b1+b2="+ret);
	}
}

结果:

目录

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

(1)、与运算(&)

(2)、或运算(|)

(3)、异或运算(^)

(4)、取反(~)

(5)、左移运算(<<)

(6)、右移运算(>>)

二、整数类型运算时的类型溢出

产生原因:

解决办法:

三、浮点数经度丢失问题

产生原因:

解决办法:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值