一.常见的位运算使用场景:
1.java中的常见位运算符一共有7个:
符号 | 含义 |
& | 按位与,and。两个数字相同位上,同1为1,一0为0 |
| | 按位或,or。两个数字相同位上,一1为1,同0为0 |
^ | 按位异或,xor。两个数字相同位上,相同为0,不同为1 |
~ | 按位取反,not。1变为0,0变为1 |
<< | 左移,shl。a<<b表示把a的二进制数左移b位,最右边空出的b位用0补充。运算结果相当于a乘以2的b次方 |
>> | 右移,shr。a >> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上原来的符号位(正数为0,负数为1)。若a为正数,运算结果相当于a除以2的b次方 |
>>> | 无符号右移。a >>> b表示把a的二进制数右移b位,即去掉末尾的b位,最左边的b位补上0(无论正负都补0) |
2.位运算使用场景:
- 2.1取模运算
- 若a、b均为正数,且b是2的n次方(n为自然数),则取模操作 a % b,等价于 a & (b - 1)
- 2.2奇偶性判断
- 偶数&1=0
- 奇数&1=1
- 2.3交换变量的值
- 一个数与另一个数异或两次等于该数本身
-
//例1: int a=3,b=4 a=a^b; b=a^b; a=a^b; //例2:给出一组数,找出不重复数字(只出现一次的数字) int[] arr={6,2,7,15,2,6,7}; int n=arr[0]; for(int i=1;i<arr.length;i++){ n=n^arr[i]; } System.out.println("只出现一次的数:"+n);//n=15
-
- 一个数与另一个数异或两次等于该数本身
二.整数类型运算时的类型溢出问题,产生原因以及解决办法:
- 1.产生原因:整数类型的存储范围有限,故而会出现溢出情况
- 2.解决办法
- 2.1使用Java封装的大整数类BigInteger解决
- 2.2使用数组存储解决(防止溢出,但可能越界)
- 2.3使用可变数组解决数组越界(ArrayList)
三.浮点类型运算时的精度丢失问题,产生原因以及解决办法:
- 1.产生原因:浮点十进制值通常没有完全相同的二进制表示形式,会进行截取部分小数进行存储,从而导致计算机存储的数值只能是个大概的值,而不是精确的值
- 2.解决办法:使用Java封装的BigDecimal类解决(建议使用BigDecimal(String val)这个调用方法)