一、常见的位运算
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也可以) ,浮点数不可以 !!!!