一,常见的位运算使用场景
位运算是按照整数的二进制进行移位,与,或,非,异或的运算,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等数据类型(浮点型不能进行位运算)。由于,位运算由于直接采用二进制进行计算,所以往往可以得到计算性能的提升。
1,移位运算
<<n左移n位相当于乘以2的n次方,>>n右移n位相当于除以2的n次方
int n=8;
int b=n>>1;//相当于除以2的一次方
int c=n<<4;//相当于乘以2的4次方
System.out.println(b);
System.out.println(c);
2,与运算&
与运算规则:必须同时为1,才为1
int i=1444444;//0001 0110 0000 1010 0101 1100
int n=295959; //0000 0100 1000 0100 0001 0111
int x=i&n;
System.out.println(x);//0000 0100 0000 0000 0001 0100
3,或运算|
|或运算的运算规则是:只要一个为1,结果就为1
int i=1444444;//0001 0110 0000 1010 0101 1100
int n=295959; //0000 0100 1000 0100 0001 0111
int x=i&n;
int m=i|n;
System.out.println(m);//0001 0110 1000 1110 0101 1111
System.out.println(x);//0000 0100 0000 0000 0001 0100
4,非运算~
非运算的运算规则:0和1互换
int i=1444444;//0001 0110 0000 1010 0101 1100
int n=295959; //0000 0100 1000 0100 0001 0111
int x=i&n;
int m=i|n;//1110 1001 1111 0101 1010 0011
int q=~i;
System.out.println(q);
5,异或运算^
异或运算规则:如果像个数不同,结果为1,否则为0
int i=1444444;//0001 0110 0000 1010 0101 1100
int n=295959; //0000 0100 1000 0100 0001 0111
int b=i^n;//0001 0010 1000 1110 0100 1011
二,整数类型运算时类型溢出的问题,产生原因及解决办法
1,整数运算时的基本规则
在Java中,整数的运算遵循四则运算规则;算术运算符:+,-,*,/,%。
public static void main(String[] args) {
int a=10;
int b=2;
int add=a+b;
System.out.println("两数相加:"+add);
int c=a-b;
System.out.println("两数相减:"+c);
int d=a*b;
System.out.println("两数相乘:"+d);
int m=a/b;
System.out.println("两数相除:"+m);
int g=a%c;
System.out.println("取余"+g);
}
2,整数计算时产生的类型溢出问题
产生原因:由于整数存在范围限制(-2147483647-2147483647),如果计算结果超出了范围,就会产生溢出,二溢出不会出错,会的到一个不正确的数值。
int a1=2147483647;
int sum=a1+a;
System.out.println(sum);
解决办法:可以把int类型换成long类型,或使用BigInteger存储
long a1=2147483647;
long sum=a1+a;
System.out.println(sum);
public static void main(String[] args) {
//使用BIGUNGTER保存大整数
BigInteger n1=new BigInteger("2147162788888");
BigInteger n2=new BigInteger("2147162788886");
//加法
BigInteger sum=n1.add(n2);
System.out.println(sum);
//减法
BigInteger sub=n1.subtract(n2);
System.out.println(sub);
//乘法
BigInteger mul=n1.multiply(n2);
System.out.println(mul);
//除法
BigInteger div=n1.divide(n2);
System.out.println(div);
}
三,浮点数类型运算时产生的精度丢失问题,产生原因及解决办法
1,浮点数运算精度丢失问题
浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示,会出现精度丢失问题。
double a=0.1;
double b=0.22;
double c=a/b;
System.out.println(c);
解决办法:
BigDecimal n1=new BigDecimal("3.1415926");
BigDecimal n2=new BigDecimal("0.348");
//加法
BigDecimal sum=n1.add(n2);
System.out.println(sum);
//除法
//参数1:被除数
//参数2:保留小数位数
//参数3:截取方式:RoundingMode.HALF_DOWN为四舍五入方式
BigDecimal div=n1.divide(n2,3,RoundingMode.HALF_DOWN);
System.out.println(div);;