本文主要是介绍算法之美 | 位运算的巧妙奥秘(二) | JAVA中位运算的实际应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 一、位运算
- 二、位运算的奇思妙用
- 1.将大写字母转换成为小写字母
- 2.位运算表示乘除法
- 3.位运算判断奇偶性
- 4.利用异或交换两数
- 5.正负号交换
- 6.位运算求绝对值
- 7.计算平均值
前言
传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基础的方法,然而结果是超时,在优化的过程中,发现了位运算的一些巧妙奥秘,谨以此篇文章记载。
一、位运算
关于位运算的符号以及他的一些规则还是有必要去记录一下的(详细记录请见):
名称 | 符号 |
---|---|
按位或 | 丨 |
按位与 | & |
按位非 | ~ |
按位异或 | ^ |
左移 | << |
右移 | >> |
二、位运算的奇思妙用
熟悉以下各种位运算的扩展使用,可能会在你做题的过程中达到意向不到的妙用哦
1.将大写字母转换成为小写字母
public class Main {public static void main(String[] args) {char a='B';a= (char) (a|' ');System.out.println(a);}
}
自己的不官方理解:
运行结果:b暂时没有理解,下次一定。
2.位运算表示乘除法
public class Main {public static void main(String[] args) {int a=10;//向右 移位 1表示 除以 2a>>=1;System.out.println("10向右位移 1表示10/2:"+a);//向左位移 1表示乘2a=10;a<<=1;System.out.println("10向左位移1表示10*2:"+a);}
}
不官方理解:
运行结果:10向右位移 1表示10/2:5
10向左位移1表示10*2:20优点:运算速度会比乘除快。理解:暂时只会用
3.位运算判断奇偶性
public class Main {public static void main(String[] args) {int[] arr={1,2,3,4,5,6,7,8,9,0};for (int i = 0; i < 10; i++) {if((arr[i]& 1)==0){System.out.println(arr[i]+"是偶数");}else{System.out.println(arr[i]+"是奇数");}}}
}
不官方理解:
运行结果:
1是奇数
2是偶数
3是奇数
4是偶数
5是奇数
6是偶数
7是奇数
8是偶数
9是奇数
0是偶数理解:根据数的二进制可知,二进制数的最后一位如果是0 那么这个数为偶数,如果一个数的二进制数的最后一位是1,
那么这个数肯定是奇数。
4.利用异或交换两数
public class Main {public static void main(String[] args) {//不使用介质交换两数int a=5,b=4;a^=b;b^=a;a^=b;System.out.println("a="+a);System.out.println("b="+b);}
}
不官方理解:
运行结果:
a=4
b=5理解: 暂时没有
5.正负号交换
public class Main {public static void main(String[] args) {int a=3;a=~a+1;System.out.println(a);}
}
不官方理解:
运行结果:
-3理解: 整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数
6.位运算求绝对值
public class Main {public static void main(String[] args) {//根据整数右移 31 位得到 0,负数右移 31 位得到 -1,判断符号位int a=-32;a=(a>>31)==0?a:(~a+1);System.out.println("-32的绝对值为" + a);//也可以使用大于零来判断符号位int b=-32;b=b>0 ?b :(~b+1);System.out.println("-32的绝对值为"+b);}
}
不官方解释:
运行结果:
-32的绝对值为32理解:整数的绝对值是整数 负数的绝对值正好可以对其进行取反加一求得,
不过在此之前我们要判断一下符号位(根据移位判断或者根据大于零小于零来判断)
7.计算平均值
public class Main {public static void main(String[] args) {int a=10,b=20;int average=(a&b)+(a^b)>>1;System.out.println(average);}
}
不管方解释:
因为在计算平均数的过程中,有可能会在a+b的溢出,因此我们可以使用上面的算法进行优化。
对于位运算的使用扩展暂时到此为止了。
这篇关于算法之美 | 位运算的巧妙奥秘(二) | JAVA中位运算的实际应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!