0
点赞
收藏
分享

微信扫一扫

【第32天】位运算 & 的使用 | &的四种妙用


​​​​

学习指引

  • ​​序、专栏前言​​
  • ​​一. 位于运算符​​
  • ​​二.位运算的应用​​
  • ​​1)判断奇偶性​​
  • ​​2)lowbit操作​​
  • ​​3)取末5位​​
  • ​​4)判断2的幂数​​
  • ​​三、推荐专栏​​
  • ​​四、课后习题​​

序、专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习​​Java​​​,特别是一些​​Java学习者​​​难以在网上找到系统地算法学习资料帮助自身入门算法
   但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
   算法的学习肯定不能缺少总结,这里我推荐大家可以到​高校算法社区​将学过的知识进行打卡,以此来进行巩固以及复习。
  学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。

一. 位于运算符

  • ​​​&​​​运算是一个二元的位运算符,也就是对两个数进行操作,比如​​x​​​&​​y​​。
  • ​​​&​​​运算会对操作数的二进制数的每一位按照如下表格计算,因为是二进制数,所以每一位非​​1​​​即​​0​​​,组合得到钟情况

左操作数

右操作数

结果

0

0

0

0

1

0

1

0

0

1

1

1

  • 从该表可以轻易得出​​&​​运算的性质
  • 无论是​​​1​​​还是​​0​​​,只要与上​​1​​,还是它自己
  • 无论是​​​1​​​还是​​0​​​,只要与上​​0​​​,就变成​​0​
  • 只要两个​​​1​​​相与才能得到​​1​​。

public class Main {
public static void main(String[] args) {
int a=0b101010;
int b=0b110101;
System.out.println(a&b);
}
}

  • 在​​​Java​​​中,开头以​​0b​​​声明,表示该数为一个二进制数,所以实际上​​a​​​的值应该是,​​​b​​​的值实际上应该是
  • 那么此时​​​a&b​​​就是对它们二进制的每一位均做上述表格的运算,我们会得到答案为
  • 注意在实际的运算中两个数的二进制位长度不一定相同,短的补前导​​​0​​即可。

二.位运算的应用

1)判断奇偶性

  在平时,我们判断对一个数判断奇偶性,通常通过对​​2​​​来取模​​%​​判断。

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
if (a%2==0) System.out.println(a+"是偶数");
else System.out.println(a+"是奇数");
}
}

当然,我们现在学习了​​&​​​运算就可以使用它来判断奇偶性啦,我们知道一个数如果为奇数那么它的二进制末位一定为​​1​​​,否则为​​0​​​,那我们只需要将它和​​1​​​进行​​&​​运算就可以知道它是奇数还是偶数啦!

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
if ((a&1)==0) System.out.println(a+"是偶数");
else System.out.println(a+"是奇数");
}
}

2)lowbit操作

  ​​lowbit​​​操作是一个非常重要的操作,它的作用是获取某个数​​x​​​的二进制表示中最低位的​​1​​​对于的值,它在高级数据结构树状数组中,是最核心的应用,可以说树状数组就是基于​​lowbit​​​操作而实现的。
  了解​​​lowbit​​​,首先要知道在计算机中负数的的二进制表示是正数的取反再加​​1​​​,比如​​12​​​的二进制表示为,则​​​-12​​​的进制表示则为,二者一旦进行​​​&​​​运算,即得到,这恰好是​​​12​​​二进制表示最末尾的​​1​​​的值。
  利用这个操作,我们可以将一个数​​​x​​​的二进制表示所有的​​1​​取出来。

import java.util.Scanner;
public class C {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
while (x!=0){
int v=lowbit(x);
System.out.println(v);
x-=v;
}
}
static int lowbit(int x){
return x&-x;
}
}

3)取末5位

  给定一个整数​​x​​,求它的二进制表示的末五位的值,以十进制进行输出

  • 题目的核心在于,我们只考虑末五位的值,其余当​​​0​​​考虑,因为无论是​​0​​​还是​​1​​​它与上​​1​​​都是不变的,所以我们可以将​​x​​​与上​​0b11111​​,这样得到的就是末五位的值了。

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
System.out.println(x&(0b11111));
}
}

4)判断2的幂数

  给定一个整数​​x​​​,请你判断它是否是​​2​​的幂数。

  首先我们必须清楚,如果一个整数是​​2​​​的幂数,那么它的二进制表示一定是这样的形式

,它的二进制表示中只会有一个​​​1​​​,这时我们可以联想到上文讲述过的​​lowbit​​​运算,将这一位​​1​​​取出的值看它是否等于​​x​​​,是则为​​2​​的幂数。

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
if (x>0&&x==(x&-x)) System.out.println(x+"是2的幂数");
else System.out.println(x+"不是2的幂数");
}
}

  当然我们还有其他的做法,刚才我们说到了,一个​​2​​​的幂数的数​​x​​​二进制表示一定如下

  那么​​​x-1​​​的二进制表示应该如下:

  • 如果细心观察,很容易发现,两个数如果​​​&​​​上结果为0,所以当​​x&(x-1)​​​为0时可以判断该数是​​2​​的幂数。

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int x=sc.nextInt();
if (x>0&&(x&(x-1))==0) System.out.println(x+"是2的幂数");
else System.out.println(x+"不是2的幂数");
}
}

  • 当然上述两种方式我们需要对​​​0​​进行特判。
  • 【第32天】位运算 & 的使用 | &的四种妙用_算法_23

​​​​


课后习题

序号

题目链接

难度评级

1

​​ 2的幂​​

1

1

​​ 4的幂​​

2

1

​​前 n 个数字二进制中 1 的个数​​

2


举报

相关推荐

0 条评论