学习指引
- 序、专栏前言
- 一. 位于运算符
- 二.位运算的应用
- 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
进行特判。
课后习题
序号 | 题目链接 | 难度评级 |
1 | 2的幂 | 1 |
1 | 4的幂 | 2 |
1 | 前 n 个数字二进制中 1 的个数 | 2 |