概述
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
将人类自然语言转化为机器语言来参与运算
位运算通常比其他运算更高效,原因如下:
- 硬件支持:现代计算机中的处理器通常会针对位运算提供专门的硬件支持,使得位运算可以在硬件层面上被高效执行。
- 简单操作:位运算是对二进制位进行简单的逻辑操作,相比其他运算(如乘法、除法)而言,位运算的操作逻辑更为简单,因此执行速度通常更快。
- 逻辑清晰:位运算的逻辑清晰,不涉及复杂的算术计算,因此在一些情况下,使用位运算可以使代码更易于理解和维护。
- 优化算法:在一些算法和数据结构中,位运算可以用来实现高效的算法,例如位图、哈希算法等,这些算法在性能上通常比其他实现更高效。
- 内存占用:位运算可以在一些情况下减少内存占用,例如使用位掩码来表示多个布尔值,可以节省内存空间。
总的来说,位运算在处理位级别的数据时通常更高效,但在某些情况下,它可能不够直观,需要权衡使用场景和代码可读性。
运算符
学习资料
位运算(&、|、^、~、>>、 | 菜鸟教程
基本用途
判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。
因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
乘与除
可以有效防止二进制补码占据符号位后参与运算
每左移<<一位,相当于该数乘以2。
操作数每右移>>一位,相当于该数除以2。
算法题入门
package Dduo; import java.util.Scanner; public class Main { public static void main(String[] args) { //判断一个数是2的幂次方 Scanner sc=new Scanner(System.in); int n=sc.nextInt(); //与运算 二进制补码都为1 才为1 否则为0 System.out.print((n>0)&&((n&(n-1))==0)); } }
特征 初等数论 同余问题
package Dduo; import java.util.Scanner; public class Main { public static void main(String[] args) { //判断一个数是4的幂次方 Scanner sc=new Scanner(System.in); int n=sc.nextInt(); System.out.print( (n>0) && ( ((n&(n-1))==0) && (n%3==1) ) ); } }
如果一个数是偶数 在 -1
那么他二进制补码 最左边的1 右边的所有数都要变
然而这个不是目的
这时我们再进行与运算
运算一次 消去了一个0
package Dduo; import java.util.Scanner; public class Main { public static void main(String[] args) { //判断一个十进制数转化为二进制后设置位的个数 Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int cnt =0; while(n>0) { n &=(n-1); cnt++; } System.out.print(cnt); } }