一、常见的位运算使用场景
(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);
}
}
结果:
目录